diff --git a/OAT.xml b/OAT.xml
index c72788ac93f6427d06e8ad04814670b7add779d5..5e58f52dc8d25a68d4cd0c28556751f815656115 100644
--- a/OAT.xml
+++ b/OAT.xml
@@ -73,6 +73,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/ohos/test_cached_network_image/.gitignore b/ohos/test_cached_network_image/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..24476c5d1eb55824c76d8b01a3965f94abad1ef8
--- /dev/null
+++ b/ohos/test_cached_network_image/.gitignore
@@ -0,0 +1,44 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/ohos/test_cached_network_image/.metadata b/ohos/test_cached_network_image/.metadata
new file mode 100644
index 0000000000000000000000000000000000000000..c64177774df6a3ceb0f67e70374ac42f58b6bccb
--- /dev/null
+++ b/ohos/test_cached_network_image/.metadata
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled.
+
+version:
+ revision: 0251c48f3356696dfeb79833b1cb00ea8717a982
+ channel: master
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 0251c48f3356696dfeb79833b1cb00ea8717a982
+ base_revision: 0251c48f3356696dfeb79833b1cb00ea8717a982
+ - platform: ohos
+ create_revision: 0251c48f3356696dfeb79833b1cb00ea8717a982
+ base_revision: 0251c48f3356696dfeb79833b1cb00ea8717a982
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/ohos/test_cached_network_image/README.md b/ohos/test_cached_network_image/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ohos/test_cached_network_image/analysis_options.yaml b/ohos/test_cached_network_image/analysis_options.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..6ddaee52a3c1b7a6ed51caf1e7e69037e53dc4ab
--- /dev/null
+++ b/ohos/test_cached_network_image/analysis_options.yaml
@@ -0,0 +1,44 @@
+##
+## Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+## Licensed under the Apache License, Version 2.0 (the "License");
+## you may not use this file except in compliance with the License.
+## You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+##
+
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at
+ # https://dart-lang.github.io/linter/lints/index.html.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/ohos/test_cached_network_image/lib/common/base_page.dart b/ohos/test_cached_network_image/lib/common/base_page.dart
new file mode 100644
index 0000000000000000000000000000000000000000..987585c34978cebd1560dbba1ff3f5fb542512ef
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/common/base_page.dart
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+import 'package:flutter/material.dart';
+
+import 'main_item_widget.dart';
+import 'test_route.dart';
+
+/// 全局静态数据存储
+abstract class GlobalData {
+ static String appName = '';
+}
+
+/// app基本首页
+class BasePage extends StatefulWidget {
+ const BasePage({required this.data});
+
+ final List data;
+
+ @override
+ State createState() => _BasePageState();
+}
+
+class _BasePageState extends State {
+ int get _itemCount => widget.data.length;
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Center(
+ child: Text(GlobalData.appName, textAlign: TextAlign.center)),
+ ),
+ body:
+ ListView.builder(itemBuilder: _itemBuilder, itemCount: _itemCount));
+ }
+
+ Widget _itemBuilder(BuildContext context, int index) {
+ return MainItemWidget(widget.data[index], (MainItem item) {
+ Navigator.push(context, MaterialPageRoute(builder: (content) => item.route));
+ });
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/common/item_widget.dart b/ohos/test_cached_network_image/lib/common/item_widget.dart
new file mode 100644
index 0000000000000000000000000000000000000000..2f6c380665461e81d7085bfae36e837c2c552a85
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/common/item_widget.dart
@@ -0,0 +1,127 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+import 'test_page.dart';
+
+/// Item widget.
+class ItemWidget extends StatefulWidget {
+ /// Item widget.
+ const ItemWidget(
+ {required this.item, required this.index, required this.getGroupRange, required this.runGroup, required this.onTap, this.summary, Key? key})
+ : super(key: key);
+
+ /// item summary.
+ final String? summary;
+
+ /// item data.
+ final Item item;
+
+ /// 当前下标
+ final int index;
+
+ /// 获取对应的组信息
+ final GroupRange Function() getGroupRange;
+
+ /// 获取对应的组信息
+ final void Function(int start, int end) runGroup;
+
+ /// Action when pressed (typically run).
+ final void Function(Item item) onTap;
+
+ @override
+ ItemWidgetState createState() => ItemWidgetState();
+}
+
+class ItemWidgetState extends State {
+ @override
+ Widget build(BuildContext context) {
+ IconData? icon;
+ Color? color;
+
+ switch (widget.item.state) {
+ case ItemState.none:
+ icon = Icons.arrow_forward_ios;
+ break;
+ case ItemState.running:
+ icon = Icons.more_horiz;
+ break;
+ case ItemState.success:
+ icon = Icons.check;
+ color = Colors.green;
+ break;
+ case ItemState.failure:
+ icon = Icons.close;
+ color = Colors.red;
+ break;
+ }
+
+ final Widget listTile = ListTile(
+ leading: SizedBox(
+ child: IconButton(
+ icon: Icon(icon, color: color),
+ onPressed: null,
+ )),
+ title: Text(widget.item.name),
+ subtitle: widget.summary != null ? Text(widget.summary!) : null,
+ onTap: () {
+ widget.onTap(widget.item);
+ });
+
+ final data = widget.getGroupRange();
+
+ return Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ if (data.groupName.isNotEmpty && data.startIndex == widget.index)
+ GestureDetector(
+ onTap: () {},
+ child: Container(
+ height: 35,
+ decoration: BoxDecoration(color: CupertinoColors.extraLightBackgroundGray),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Expanded(child: Text(
+ '测试组: ${data.groupName}',
+ style: TextStyle(fontSize: 18),
+ overflow: TextOverflow.ellipsis,
+ )),
+ // FilledButton(
+ // onPressed: () => widget.runGroup(data.startIndex, data.startIndex),
+ // child: Text(
+ // '整组测试',
+ // style: TextStyle(fontSize: 16),
+ // ))
+ ],
+ ),
+ ),
+ ),
+ Container(
+ margin: data.groupName.isNotEmpty && data.startIndex == widget.index ? EdgeInsets.only(bottom: 10) : null,
+ decoration: BoxDecoration(
+ border: data.groupName.isNotEmpty && data.endIndex == widget.index ? Border(bottom: BorderSide(color: Colors.grey)) : null,
+ ),
+ child: Padding(
+ padding: data.groupName.isNotEmpty && data.startIndex <= widget.index && data.endIndex >= widget.index ? EdgeInsets.only(left: 35) : EdgeInsets.zero,
+ child: listTile,
+ ),
+ )
+ ],
+ );
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/common/main_item_widget.dart b/ohos/test_cached_network_image/lib/common/main_item_widget.dart
new file mode 100644
index 0000000000000000000000000000000000000000..c49255738e5a7c8d934dd6813ffd853e960c839c
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/common/main_item_widget.dart
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+import 'test_route.dart';
+
+/// Main item widget.
+class MainItemWidget extends StatefulWidget {
+ /// Main item widget.
+ const MainItemWidget(this.item, this.onTap, {Key? key}) : super(key: key);
+
+ /// item data.
+ final MainItem item;
+
+ /// onTap action (typically run or open).
+ final void Function(MainItem item) onTap;
+
+ @override
+ MainItemWidgetState createState() => MainItemWidgetState();
+}
+
+class MainItemWidgetState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ margin: const EdgeInsets.only(bottom: 10),
+ child: ListTile(
+ tileColor: CupertinoColors.extraLightBackgroundGray,
+ title: Text(widget.item.title),
+ onTap: _onTap),
+ );
+ }
+
+ void _onTap() {
+ widget.onTap(widget.item);
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/common/test_model_app.dart b/ohos/test_cached_network_image/lib/common/test_model_app.dart
new file mode 100644
index 0000000000000000000000000000000000000000..045851633e9cad7d8ff09f2836930125c71216ee
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/common/test_model_app.dart
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+import 'package:flutter/material.dart';
+
+import 'base_page.dart';
+import 'test_route.dart';
+
+/// 基础app框架
+class TestModelApp extends StatefulWidget {
+ TestModelApp({super.key, required this.appName, required this.data}) {
+ GlobalData.appName = appName;
+ }
+
+ /// 测试包名称
+ final String appName;
+
+ /// 路由数据
+ final List data;
+
+ @override
+ State createState() => TestModelState();
+}
+
+class TestModelState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ title: widget.appName,
+ theme: ThemeData(
+ colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
+ appBarTheme: const AppBarTheme(backgroundColor: Colors.blue),
+ primarySwatch: Colors.blue,
+ useMaterial3: true,
+ ),
+ home: BasePage(data: widget.data),
+ );
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/common/test_page.dart b/ohos/test_cached_network_image/lib/common/test_page.dart
new file mode 100644
index 0000000000000000000000000000000000000000..3fbbeb3cd4375bf7eab9daf885146ac568372cb8
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/common/test_page.dart
@@ -0,0 +1,334 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+
+import 'item_widget.dart';
+
+List contentList = [];
+
+class Test {
+ /// Test definition.
+ Test(this.name, this.fn, {bool? solo, bool? skip})
+ : solo = solo == true,
+ skip = skip == true;
+
+ /// Only run this test.
+ final bool solo;
+
+ /// Skip this test.
+ final bool skip;
+
+ /// Test name.
+ String name;
+
+ /// Test body.
+ FutureOr Function() fn;
+}
+
+/// Item states.
+enum ItemState {
+ /// test not run yet.
+ none,
+
+ /// test is running.
+ running,
+
+ /// test succeeded.
+ success,
+
+ /// test fails.
+ failure
+}
+
+/// Menu item.
+class Item {
+ /// Menu item.
+ Item(this.name);
+
+ /// Menu item state.
+ ItemState state = ItemState.running;
+
+ /// Menu item name/
+ String name;
+}
+
+class TestLength {
+ TestLength(this.oldLength, this.newLength);
+
+ int oldLength;
+ int newLength;
+}
+
+class GroupRange {
+ GroupRange(this.groupName, this.startIndex, this.endIndex);
+
+ String groupName;
+ int startIndex;
+ int endIndex;
+}
+
+/// 基础测试页面
+class TestPage extends StatefulWidget {
+ /// Base test page.
+ TestPage({required this.title, Key? key}) : super(key: key);
+
+ /// The title.
+ final String title;
+
+ /// Test list.
+ final List tests = [];
+
+ /// 保存group的范围信息
+ final Map groupTitle = {};
+
+ /// define a test.
+ void test(String name, FutureOr Function() fn) {
+ tests.add(Test(name, fn));
+ }
+
+ /// define a group test.
+ void group(String name, FutureOr Function() fn) {
+ int oldLength = tests.length;
+ fn();
+
+ int newLength = tests.length - 1;
+ groupTitle.addAll({name: TestLength(oldLength, newLength)});
+ }
+
+ /// Thrown an exception
+ void fail([String? message]) {
+ throw Exception(message ?? 'should fail');
+ }
+
+ @override
+ TestPageState createState() => TestPageState();
+}
+
+/// Group.
+mixin Group {
+ /// List of tests.
+ List get tests {
+ // TODO: implement tests
+ throw UnimplementedError();
+ }
+
+ bool? _hasSolo;
+ final _tests = [];
+
+ /// Add a test.
+ void add(Test test) {
+ if (!test.skip) {
+ if (test.solo) {
+ if (_hasSolo != true) {
+ _hasSolo = true;
+ _tests.clear();
+ }
+ _tests.add(test);
+ } else if (_hasSolo != true) {
+ _tests.add(test);
+ }
+ }
+ }
+
+ /// true if it has solo or contains item with solo feature
+ bool? get hasSolo => _hasSolo;
+}
+
+class TestPageState extends State with Group {
+ List- items = [];
+
+ Future _run() async {
+ if (!mounted) {
+ return null;
+ }
+
+ setState(() {
+ items.clear();
+ });
+ _tests.clear();
+ for (var test in widget.tests) {
+ add(test);
+ }
+ for (var test in _tests) {
+ var item = Item(test.name);
+ contentList.add(Text(test.name,
+ style: const TextStyle(fontSize: 18, color: Colors.green)));
+
+ late int position;
+ setState(() {
+ position = items.length;
+ items.add(item);
+ });
+ try {
+ await test.fn();
+ item = Item(test.name)..state = ItemState.success;
+ print('ohFlutter: ${test.name}, result: success');
+ } catch (e, st) {
+ contentList.add(Text('$e, $st',
+ style: const TextStyle(fontSize: 18, color: Colors.red)));
+ print('ohFlutter: ${test.name}-error: $e, $st}');
+ item = Item(test.name)..state = ItemState.failure;
+ }
+
+ if (!mounted) {
+ return null;
+ }
+
+ setState(() {
+ items[position] = item;
+ });
+ }
+ }
+
+ Future _runTest(int index) async {
+ if (!mounted) {
+ return null;
+ }
+
+ final test = _tests[index];
+
+ var item = items[index];
+ setState(() {
+ contentList = [];
+ item.state = ItemState.running;
+ });
+ contentList.add(Text(test.name,
+ style: const TextStyle(fontSize: 18, color: Colors.green)));
+ try {
+ await test.fn();
+
+ item = Item(test.name)..state = ItemState.success;
+ print('ohFlutter: ${test.name}, result: success');
+ } catch (e, st) {
+ contentList.add(Text('$e, $st',
+ style: const TextStyle(fontSize: 18, color: Colors.red)));
+ print('ohFlutter: ${test.name}-error: $e, $st}');
+ try {
+ print(st);
+ } catch (_) {}
+ item = Item(test.name)..state = ItemState.failure;
+ }
+
+ if (!mounted) {
+ return null;
+ }
+
+ setState(() {
+ items[index] = item;
+ });
+ showAlertDialog(context);
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ contentList = [];
+ _run();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text(widget.title),
+ actions:[
+ IconButton(
+ onPressed: () {
+ showAlertDialog(context);
+ },
+ icon: const Icon(Icons.search_outlined),
+ )
+ ]
+ ),
+ body: ListView(children: [
+ ...items.asMap().keys.map((e) => _itemBuilder(context, e)).toList(),
+ ]));
+ }
+
+ Widget _itemBuilder(BuildContext context, int index) {
+ final item = getItem(index);
+ return ItemWidget(
+ item: item,
+ index: index,
+ getGroupRange: () {
+ GroupRange data = GroupRange('', 0, 0);
+ widget.groupTitle.forEach((key, value) {
+ if (value.oldLength <= index && value.newLength >= index) {
+ data = GroupRange(key, value.oldLength, value.newLength);
+ }
+ });
+ return data;
+ },
+ runGroup: (start, end) async {
+ for (var i = start; i <= end; i++) {
+ await _runTest(i);
+ print('\n');
+ }
+ },
+ onTap: (Item item) {
+ _runTest(index);
+ }
+ );
+ }
+
+ Item getItem(int index) {
+ return items[index];
+ }
+
+ @override
+ List
get tests => widget.tests;
+}
+
+void expect(var testModel, var object) {
+ try {
+ testModel;
+ contentList.add(Text('$testModel'));
+ } catch (e) {
+ contentList.add(Text(
+ '$e',
+ style: const TextStyle(color: Colors.red),
+ ));
+ print(e.toString());
+ }
+}
+
+void showAlertDialog(BuildContext context) {
+ for (int i = 0; i < contentList.length; i++) {
+ print(contentList[i].data);
+ }
+ showDialog(
+ context: context,
+ barrierDismissible: false,
+ builder: (BuildContext context) {
+ return AlertDialog(
+ content: SingleChildScrollView(
+ child: Column(
+ children: contentList,
+ ),
+ ),
+ actions: [
+ MaterialButton(
+ child: const Text('确定'),
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ ),
+ ],
+ );
+ });
+}
diff --git a/ohos/test_cached_network_image/lib/common/test_route.dart b/ohos/test_cached_network_image/lib/common/test_route.dart
new file mode 100644
index 0000000000000000000000000000000000000000..64478b233caa2d718c7c63b8477c0021406cd59a
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/common/test_route.dart
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import 'package:flutter/cupertino.dart';
+
+import 'base_page.dart';
+
+class MainItem {
+ /// Main item.
+ MainItem(this.title, this.route);
+
+ /// title.
+ String title;
+
+ /// Page route.
+ Widget route;
+}
diff --git a/ohos/test_cached_network_image/lib/main.dart b/ohos/test_cached_network_image/lib/main.dart
new file mode 100644
index 0000000000000000000000000000000000000000..6fc64661a1bd78fa4cba554c730a5af1222d0af5
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/main.dart
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+import 'dart:io';
+
+import 'package:flutter/material.dart';
+import 'package:test_cached_network_image/src/fix_bug.dart';
+import 'package:test_cached_network_image/src/image_cache_manager_test.dart';
+import 'package:test_cached_network_image/src/image_provider_test.dart';
+import 'package:test_cached_network_image/src/image_stream_completer_test.dart';
+import 'package:test_cached_network_image/src/image_widget_test.dart';
+import 'package:test_cached_network_image/src/ui_apge.dart';
+
+import 'common/test_model_app.dart';
+import 'common/test_route.dart';
+
+void main() {
+ WidgetsFlutterBinding.ensureInitialized();
+ HttpOverrides.global = GlobalHttpOverrides();
+ final app = [
+ // MainItem('仅测试使用', FixBug()),
+ MainItem('演示包含[CachedNetworkImage]的[StatelessWidget]', BasicContent()),
+ MainItem('演示包含[CachedNetworkImage]的[ListView]', ListContent()),
+ MainItem('演示包含[CachedNetworkImage]的[GridView]', GridContent()),
+ MainItem('CachedNetworkImage', ImageWidgetTestPage('CachedNetworkImage')),
+ MainItem('MultiImageStreamCompleter', ImageStreamCompleterTestPage('MultiImageStreamCompleter')),
+ MainItem('CachedNetworkImageProvider', ImageProviderTestPage('CachedNetworkImageProvider')),
+ MainItem('ImageCacheManager', ImageCacheManagerTestPage('ImageCacheManager')),
+ ];
+
+ runApp(TestModelApp(appName: 'CachedNetworkImage', data: app));
+}
+
+class GlobalHttpOverrides extends HttpOverrides {
+ @override
+ HttpClient createHttpClient(SecurityContext? context) {
+ // TODO: implement createHttpClient
+ return super.createHttpClient(context)..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/CHANGELOG.md b/ohos/test_cached_network_image/lib/path_provider-2.0.0/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/README.md b/ohos/test_cached_network_image/lib/path_provider-2.0.0/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/build.gradle b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..9659efbc03d27a916d09b72494bb6005c66f516d
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/build.gradle
@@ -0,0 +1,46 @@
+group 'io.flutter.plugins.pathprovider'
+version '1.0-SNAPSHOT'
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.3.0'
+ }
+}
+
+rootProject.allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+apply plugin: 'com.android.library'
+
+android {
+ compileSdkVersion 29
+
+ defaultConfig {
+ minSdkVersion 16
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+ lintOptions {
+ disable 'InvalidPackage'
+ }
+ android {
+ compileOptions {
+ sourceCompatibility 1.8
+ targetCompatibility 1.8
+ }
+ }
+}
+
+dependencies {
+ implementation 'androidx.annotation:annotation:1.1.0'
+ implementation 'com.google.guava:guava:28.1-android'
+ testImplementation 'junit:junit:4.12'
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/gradle.properties b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/gradle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8bd86f6805108dec87d0be823bdb1384bec8aa19
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/gradle.properties
@@ -0,0 +1 @@
+org.gradle.jvmargs=-Xmx1536M
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/settings.gradle b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/settings.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..71bc90768477fb1e2bd5a2535dec5531c3986580
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'path_provider'
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/main/AndroidManifest.xml b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..abb2584adcb41e98809f390a23233ea51a2530ec
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+
+
+
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java
new file mode 100644
index 0000000000000000000000000000000000000000..902811dcb367ae535230ce67b6b69f83a5126b79
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.flutter.plugins.pathprovider;
+
+import android.content.Context;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.os.Handler;
+import android.os.Looper;
+import androidx.annotation.NonNull;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.SettableFuture;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import io.flutter.embedding.engine.plugins.FlutterPlugin;
+import io.flutter.plugin.common.MethodCall;
+import io.flutter.plugin.common.MethodChannel;
+import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
+import io.flutter.plugin.common.MethodChannel.Result;
+import io.flutter.util.PathUtils;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+public class PathProviderPlugin implements FlutterPlugin, MethodCallHandler {
+
+ private Context context;
+ private MethodChannel channel;
+ private final Executor uiThreadExecutor = new UiThreadExecutor();
+ private final Executor executor =
+ Executors.newSingleThreadExecutor(
+ new ThreadFactoryBuilder()
+ .setNameFormat("path-provider-background-%d")
+ .setPriority(Thread.NORM_PRIORITY)
+ .build());
+
+ public PathProviderPlugin() {}
+
+ @SuppressWarnings("deprecation")
+ public static void registerWith(io.flutter.plugin.common.PluginRegistry.Registrar registrar) {
+ PathProviderPlugin instance = new PathProviderPlugin();
+ instance.channel = new MethodChannel(registrar.messenger(), "plugins.flutter.io/path_provider");
+ instance.context = registrar.context();
+ instance.channel.setMethodCallHandler(instance);
+ }
+
+ @Override
+ public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
+ channel = new MethodChannel(binding.getBinaryMessenger(), "plugins.flutter.io/path_provider");
+ context = binding.getApplicationContext();
+ channel.setMethodCallHandler(this);
+ }
+
+ @Override
+ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
+ channel.setMethodCallHandler(null);
+ channel = null;
+ }
+
+ private void executeInBackground(Callable task, Result result) {
+ final SettableFuture future = SettableFuture.create();
+ Futures.addCallback(
+ future,
+ new FutureCallback() {
+ public void onSuccess(T answer) {
+ result.success(answer);
+ }
+
+ public void onFailure(Throwable t) {
+ result.error(t.getClass().getName(), t.getMessage(), null);
+ }
+ },
+ uiThreadExecutor);
+ executor.execute(
+ () -> {
+ try {
+ future.set(task.call());
+ } catch (Throwable t) {
+ future.setException(t);
+ }
+ });
+ }
+
+ @Override
+ public void onMethodCall(MethodCall call, @NonNull Result result) {
+ switch (call.method) {
+ case "getTemporaryDirectory":
+ executeInBackground(() -> getPathProviderTemporaryDirectory(), result);
+ break;
+ case "getApplicationDocumentsDirectory":
+ executeInBackground(() -> getPathProviderApplicationDocumentsDirectory(), result);
+ break;
+ case "getStorageDirectory":
+ executeInBackground(() -> getPathProviderStorageDirectory(), result);
+ break;
+ case "getExternalCacheDirectories":
+ executeInBackground(() -> getPathProviderExternalCacheDirectories(), result);
+ break;
+ case "getExternalStorageDirectories":
+ final Integer type = call.argument("type");
+ final String directoryName = StorageDirectoryMapper.androidType(type);
+ executeInBackground(() -> getPathProviderExternalStorageDirectories(directoryName), result);
+ break;
+ case "getApplicationSupportDirectory":
+ executeInBackground(() -> getApplicationSupportDirectory(), result);
+ break;
+ default:
+ result.notImplemented();
+ }
+ }
+
+ private String getPathProviderTemporaryDirectory() {
+ return context.getCacheDir().getPath();
+ }
+
+ private String getApplicationSupportDirectory() {
+ return PathUtils.getFilesDir(context);
+ }
+
+ private String getPathProviderApplicationDocumentsDirectory() {
+ return PathUtils.getDataDirectory(context);
+ }
+
+ private String getPathProviderStorageDirectory() {
+ final File dir = context.getExternalFilesDir(null);
+ if (dir == null) {
+ return null;
+ }
+ return dir.getAbsolutePath();
+ }
+
+ private List getPathProviderExternalCacheDirectories() {
+ final List paths = new ArrayList<>();
+
+ if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
+ for (File dir : context.getExternalCacheDirs()) {
+ if (dir != null) {
+ paths.add(dir.getAbsolutePath());
+ }
+ }
+ } else {
+ File dir = context.getExternalCacheDir();
+ if (dir != null) {
+ paths.add(dir.getAbsolutePath());
+ }
+ }
+
+ return paths;
+ }
+
+ private List getPathProviderExternalStorageDirectories(String type) {
+ final List paths = new ArrayList<>();
+
+ if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
+ for (File dir : context.getExternalFilesDirs(type)) {
+ if (dir != null) {
+ paths.add(dir.getAbsolutePath());
+ }
+ }
+ } else {
+ File dir = context.getExternalFilesDir(type);
+ if (dir != null) {
+ paths.add(dir.getAbsolutePath());
+ }
+ }
+
+ return paths;
+ }
+
+ private static class UiThreadExecutor implements Executor {
+ private final Handler handler = new Handler(Looper.getMainLooper());
+
+ @Override
+ public void execute(Runnable command) {
+ handler.post(command);
+ }
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/main/java/io/flutter/plugins/pathprovider/StorageDirectoryMapper.java b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/main/java/io/flutter/plugins/pathprovider/StorageDirectoryMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..23459294300e4f91eeee552804b29f454c12716c
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/main/java/io/flutter/plugins/pathprovider/StorageDirectoryMapper.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.flutter.plugins.pathprovider;
+
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.os.Environment;
+
+/** Helps to map the Dart `StorageDirectory` enum to a Android system constant. */
+class StorageDirectoryMapper {
+
+ /**
+ * Return a Android Environment constant for a Dart Index.
+ *
+ * @return The correct Android Environment constant or null, if the index is null.
+ * @throws IllegalArgumentException If `dartIndex` is not null but also not matches any known
+ * index.
+ */
+ static String androidType(Integer dartIndex) throws IllegalArgumentException {
+ if (dartIndex == null) {
+ return null;
+ }
+
+ switch (dartIndex) {
+ case 0:
+ return Environment.DIRECTORY_MUSIC;
+ case 1:
+ return Environment.DIRECTORY_PODCASTS;
+ case 2:
+ return Environment.DIRECTORY_RINGTONES;
+ case 3:
+ return Environment.DIRECTORY_ALARMS;
+ case 4:
+ return Environment.DIRECTORY_NOTIFICATIONS;
+ case 5:
+ return Environment.DIRECTORY_PICTURES;
+ case 6:
+ return Environment.DIRECTORY_MOVIES;
+ case 7:
+ return Environment.DIRECTORY_DOWNLOADS;
+ case 8:
+ return Environment.DIRECTORY_DCIM;
+ case 9:
+ if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
+ return Environment.DIRECTORY_DOCUMENTS;
+ } else {
+ throw new IllegalArgumentException("Documents directory is unsupported.");
+ }
+ default:
+ throw new IllegalArgumentException("Unknown index: " + dartIndex);
+ }
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/test/java/io/flutter/plugins/pathprovider/StorageDirectoryMapperTest.java b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/test/java/io/flutter/plugins/pathprovider/StorageDirectoryMapperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..da9346003964a3aa8f353e76b7eda0bf3d09c811
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/android/src/test/java/io/flutter/plugins/pathprovider/StorageDirectoryMapperTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.flutter.plugins.pathprovider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import android.os.Environment;
+import org.junit.Test;
+
+public class StorageDirectoryMapperTest {
+
+ @org.junit.Test
+ public void testAndroidType_null() {
+ assertNull(StorageDirectoryMapper.androidType(null));
+ }
+
+ @org.junit.Test
+ public void testAndroidType_valid() {
+ assertEquals(Environment.DIRECTORY_MUSIC, StorageDirectoryMapper.androidType(0));
+ assertEquals(Environment.DIRECTORY_PODCASTS, StorageDirectoryMapper.androidType(1));
+ assertEquals(Environment.DIRECTORY_RINGTONES, StorageDirectoryMapper.androidType(2));
+ assertEquals(Environment.DIRECTORY_ALARMS, StorageDirectoryMapper.androidType(3));
+ assertEquals(Environment.DIRECTORY_NOTIFICATIONS, StorageDirectoryMapper.androidType(4));
+ assertEquals(Environment.DIRECTORY_PICTURES, StorageDirectoryMapper.androidType(5));
+ assertEquals(Environment.DIRECTORY_MOVIES, StorageDirectoryMapper.androidType(6));
+ assertEquals(Environment.DIRECTORY_DOWNLOADS, StorageDirectoryMapper.androidType(7));
+ assertEquals(Environment.DIRECTORY_DCIM, StorageDirectoryMapper.androidType(8));
+ }
+
+ @Test
+ public void testAndroidType_invalid() {
+ try {
+ assertEquals(Environment.DIRECTORY_DCIM, StorageDirectoryMapper.androidType(10));
+ fail();
+ } catch (IllegalArgumentException e) {
+ assertEquals("Unknown index: " + 10, e.getMessage());
+ }
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/Assets/.gitkeep b/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/Assets/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/Classes/FLTPathProviderPlugin.h b/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/Classes/FLTPathProviderPlugin.h
new file mode 100644
index 0000000000000000000000000000000000000000..b63a08259bcae8b0abcebb13e94555e3ec57a07c
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/Classes/FLTPathProviderPlugin.h
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#import
+
+@interface FLTPathProviderPlugin : NSObject
+@end
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/Classes/FLTPathProviderPlugin.m b/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/Classes/FLTPathProviderPlugin.m
new file mode 100644
index 0000000000000000000000000000000000000000..ad7097b3bcd72438cbabec652ebd91752343451e
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/Classes/FLTPathProviderPlugin.m
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#import "FLTPathProviderPlugin.h"
+
+NSString* GetDirectoryOfType(NSSearchPathDirectory dir) {
+ NSArray* paths = NSSearchPathForDirectoriesInDomains(dir, NSUserDomainMask, YES);
+ return paths.firstObject;
+}
+
+static FlutterError* getFlutterError(NSError* error) {
+ if (error == nil) return nil;
+ return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %ld", (long)error.code]
+ message:error.domain
+ details:error.localizedDescription];
+}
+
+@implementation FLTPathProviderPlugin
+
++ (void)registerWithRegistrar:(NSObject*)registrar {
+ FlutterMethodChannel* channel =
+ [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/path_provider"
+ binaryMessenger:registrar.messenger];
+ [channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
+ if ([@"getTemporaryDirectory" isEqualToString:call.method]) {
+ result([self getTemporaryDirectory]);
+ } else if ([@"getApplicationDocumentsDirectory" isEqualToString:call.method]) {
+ result([self getApplicationDocumentsDirectory]);
+ } else if ([@"getApplicationSupportDirectory" isEqualToString:call.method]) {
+ NSString* path = [self getApplicationSupportDirectory];
+
+ // Create the path if it doesn't exist
+ NSError* error;
+ NSFileManager* fileManager = [NSFileManager defaultManager];
+ BOOL success = [fileManager createDirectoryAtPath:path
+ withIntermediateDirectories:YES
+ attributes:nil
+ error:&error];
+ if (!success) {
+ result(getFlutterError(error));
+ } else {
+ result(path);
+ }
+ } else if ([@"getLibraryDirectory" isEqualToString:call.method]) {
+ result([self getLibraryDirectory]);
+ } else {
+ result(FlutterMethodNotImplemented);
+ }
+ }];
+}
+
++ (NSString*)getTemporaryDirectory {
+ return GetDirectoryOfType(NSCachesDirectory);
+}
+
++ (NSString*)getApplicationDocumentsDirectory {
+ return GetDirectoryOfType(NSDocumentDirectory);
+}
+
++ (NSString*)getApplicationSupportDirectory {
+ return GetDirectoryOfType(NSApplicationSupportDirectory);
+}
+
++ (NSString*)getLibraryDirectory {
+ return GetDirectoryOfType(NSLibraryDirectory);
+}
+
+@end
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/path_provider.podspec b/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/path_provider.podspec
new file mode 100644
index 0000000000000000000000000000000000000000..151d755273485f33e74efefec3a30e5b53424891
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/ios/path_provider.podspec
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
+#
+Pod::Spec.new do |s|
+ s.name = 'path_provider'
+ s.version = '0.0.1'
+ s.summary = 'Flutter Path Provider'
+ s.description = <<-DESC
+A Flutter plugin for getting commonly used locations on the filesystem.
+Downloaded by pub (not CocoaPods).
+ DESC
+ s.homepage = 'https://github.com/flutter/plugins'
+ s.license = { :type => 'BSD', :file => '../LICENSE' }
+ s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' }
+ s.source = { :http => 'https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider' }
+ s.documentation_url = 'https://pub.dev/packages/path_provider'
+ s.source_files = 'Classes/**/*'
+ s.public_header_files = 'Classes/**/*.h'
+ s.dependency 'Flutter'
+ s.platform = :ios, '8.0'
+ s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
+end
+
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/lib/path_provider.dart b/ohos/test_cached_network_image/lib/path_provider-2.0.0/lib/path_provider.dart
new file mode 100644
index 0000000000000000000000000000000000000000..0a6b944993323ab0c7a94ca2251f58a973e23117
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/lib/path_provider.dart
@@ -0,0 +1,233 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import 'dart:async';
+import 'dart:io' show Directory, Platform;
+
+import 'package:flutter/foundation.dart' show kIsWeb, visibleForTesting;
+import 'package:path_provider_linux/path_provider_linux.dart';
+import 'package:path_provider_windows/path_provider_windows.dart';
+import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
+import 'package:path_provider_platform_interface/src/method_channel_path_provider.dart';
+
+export 'package:path_provider_platform_interface/path_provider_platform_interface.dart'
+ show StorageDirectory;
+
+@visibleForTesting
+@Deprecated('This is no longer necessary, and is now a no-op')
+set disablePathProviderPlatformOverride(bool override) {}
+
+bool _manualDartRegistrationNeeded = true;
+
+/// An exception thrown when a directory that should always be available on
+/// the current platform cannot be obtained.
+class MissingPlatformDirectoryException implements Exception {
+ /// Creates a new exception
+ MissingPlatformDirectoryException(this.message, {this.details});
+
+ /// The explanation of the exception.
+ final String message;
+
+ /// Added details, if any.
+ ///
+ /// E.g., an error object from the platform implementation.
+ final Object? details;
+
+ @override
+ String toString() {
+ String detailsAddition = details == null ? '' : ': $details';
+ return 'MissingPlatformDirectoryException($message)$detailsAddition';
+ }
+}
+
+PathProviderPlatform get _platform {
+ // This is to manually endorse Dart implementations until automatic
+ // registration of Dart plugins is implemented. For details see
+ // https://github.com/flutter/flutter/issues/52267.
+ if (_manualDartRegistrationNeeded) {
+ // Only do the initial registration if it hasn't already been overridden
+ // with a non-default instance.
+ if (!kIsWeb && PathProviderPlatform.instance is MethodChannelPathProvider) {
+ if (Platform.isLinux) {
+ PathProviderPlatform.instance = PathProviderLinux();
+ } else if (Platform.isWindows) {
+ PathProviderPlatform.instance = PathProviderWindows();
+ }
+ }
+ _manualDartRegistrationNeeded = false;
+ }
+
+ return PathProviderPlatform.instance;
+}
+
+/// Path to the temporary directory on the device that is not backed up and is
+/// suitable for storing caches of downloaded files.
+///
+/// Files in this directory may be cleared at any time. This does *not* return
+/// a new temporary directory. Instead, the caller is responsible for creating
+/// (and cleaning up) files or directories within this directory. This
+/// directory is scoped to the calling application.
+///
+/// On iOS, this uses the `NSCachesDirectory` API.
+///
+/// On Android, this uses the `getCacheDir` API on the context.
+///
+/// Throws a `MissingPlatformDirectoryException` if the system is unable to
+/// provide the directory.
+Future getTemporaryDirectory() async {
+ final String? path = await _platform.getTemporaryPath();
+ if (path == null) {
+ throw MissingPlatformDirectoryException(
+ 'Unable to get temporary directory');
+ }
+ return Directory(path);
+}
+
+/// Path to a directory where the application may place application support
+/// files.
+///
+/// Use this for files you don’t want exposed to the user. Your app should not
+/// use this directory for user data files.
+///
+/// On iOS, this uses the `NSApplicationSupportDirectory` API.
+/// If this directory does not exist, it is created automatically.
+///
+/// On Android, this function uses the `getFilesDir` API on the context.
+///
+/// Throws a `MissingPlatformDirectoryException` if the system is unable to
+/// provide the directory.
+Future getApplicationSupportDirectory() async {
+ final String? path = await _platform.getApplicationSupportPath();
+ if (path == null) {
+ throw MissingPlatformDirectoryException(
+ 'Unable to get application support directory');
+ }
+
+ return Directory(path);
+}
+
+/// Path to the directory where application can store files that are persistent,
+/// backed up, and not visible to the user, such as sqlite.db.
+///
+/// On Android, this function throws an [UnsupportedError] as no equivalent
+/// path exists.
+///
+/// Throws a `MissingPlatformDirectoryException` if the system is unable to
+/// provide the directory on a supported platform.
+Future getLibraryDirectory() async {
+ final String? path = await _platform.getLibraryPath();
+ if (path == null) {
+ throw MissingPlatformDirectoryException('Unable to get library directory');
+ }
+ return Directory(path);
+}
+
+/// Path to a directory where the application may place data that is
+/// user-generated, or that cannot otherwise be recreated by your application.
+///
+/// On iOS, this uses the `NSDocumentDirectory` API. Consider using
+/// [getApplicationSupportDirectory] instead if the data is not user-generated.
+///
+/// On Android, this uses the `getDataDirectory` API on the context. Consider
+/// using [getExternalStorageDirectory] instead if data is intended to be visible
+/// to the user.
+///
+/// Throws a `MissingPlatformDirectoryException` if the system is unable to
+/// provide the directory.
+Future getApplicationDocumentsDirectory() async {
+ final String? path = await _platform.getApplicationDocumentsPath();
+ if (path == null) {
+ throw MissingPlatformDirectoryException(
+ 'Unable to get application documents directory');
+ }
+ return Directory(path);
+}
+
+/// Path to a directory where the application may access top level storage.
+/// The current operating system should be determined before issuing this
+/// function call, as this functionality is only available on Android.
+///
+/// On iOS, this function throws an [UnsupportedError] as it is not possible
+/// to access outside the app's sandbox.
+///
+/// On Android this uses the `getExternalFilesDir(null)`.
+Future getExternalStorageDirectory() async {
+ final String? path = await _platform.getExternalStoragePath();
+ if (path == null) {
+ return null;
+ }
+ return Directory(path);
+}
+
+/// Paths to directories where application specific external cache data can be
+/// stored. These paths typically reside on external storage like separate
+/// partitions or SD cards. Phones may have multiple storage directories
+/// available.
+///
+/// The current operating system should be determined before issuing this
+/// function call, as this functionality is only available on Android.
+///
+/// On iOS, this function throws an UnsupportedError as it is not possible
+/// to access outside the app's sandbox.
+///
+/// On Android this returns Context.getExternalCacheDirs() or
+/// Context.getExternalCacheDir() on API levels below 19.
+Future?> getExternalCacheDirectories() async {
+ final List? paths = await _platform.getExternalCachePaths();
+ if (paths == null) {
+ return null;
+ }
+
+ return paths.map((String path) => Directory(path)).toList();
+}
+
+/// Paths to directories where application specific data can be stored.
+/// These paths typically reside on external storage like separate partitions
+/// or SD cards. Phones may have multiple storage directories available.
+///
+/// The current operating system should be determined before issuing this
+/// function call, as this functionality is only available on Android.
+///
+/// On iOS, this function throws an UnsupportedError as it is not possible
+/// to access outside the app's sandbox.
+///
+/// On Android this returns Context.getExternalFilesDirs(String type) or
+/// Context.getExternalFilesDir(String type) on API levels below 19.
+Future?> getExternalStorageDirectories({
+ /// Optional parameter. See [StorageDirectory] for more informations on
+ /// how this type translates to Android storage directories.
+ StorageDirectory? type,
+}) async {
+ final List? paths =
+ await _platform.getExternalStoragePaths(type: type);
+ if (paths == null) {
+ return null;
+ }
+
+ return paths.map((String path) => Directory(path)).toList();
+}
+
+/// Path to the directory where downloaded files can be stored.
+/// This is typically only relevant on desktop operating systems.
+///
+/// On Android and on iOS, this function throws an [UnsupportedError] as no equivalent
+/// path exists.
+Future getDownloadsDirectory() async {
+ final String? path = await _platform.getDownloadsPath();
+ if (path == null) {
+ return null;
+ }
+ return Directory(path);
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/macos/path_provider.podspec b/ohos/test_cached_network_image/lib/path_provider-2.0.0/macos/path_provider.podspec
new file mode 100644
index 0000000000000000000000000000000000000000..176e2c983e3f9072f687367860ae0bc11d3335ea
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/macos/path_provider.podspec
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
+#
+Pod::Spec.new do |s|
+ s.name = 'path_provider'
+ s.version = '0.0.1'
+ s.summary = 'No-op implementation of the macos path_provider to avoid build issues on macos'
+ s.description = <<-DESC
+ No-op implementation of the path_provider plugin to avoid build issues on macos.
+ https://github.com/flutter/flutter/issues/46618
+ DESC
+ s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/path_provider'
+ s.license = { :file => '../LICENSE' }
+ s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' }
+ s.source = { :path => '.' }
+ s.source_files = 'Classes/**/*'
+ s.public_header_files = 'Classes/**/*.h'
+
+ s.platform = :osx
+ s.osx.deployment_target = '10.11'
+end
+
diff --git a/ohos/test_cached_network_image/lib/path_provider-2.0.0/pubspec.yaml b/ohos/test_cached_network_image/lib/path_provider-2.0.0/pubspec.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3ae3b3ffb7d262900ad4ec78281f1651827972ae
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider-2.0.0/pubspec.yaml
@@ -0,0 +1,61 @@
+##
+## Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+## Licensed under the Apache License, Version 2.0 (the "License");
+## you may not use this file except in compliance with the License.
+## You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+##
+
+name: path_provider
+description: Flutter plugin for getting commonly used locations on host platform file systems, such as the temp and app data directories.
+homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider
+version: 2.0.0
+publish_to: none
+
+flutter:
+ plugin:
+ platforms:
+ android:
+ package: io.flutter.plugins.pathprovider
+ pluginClass: PathProviderPlugin
+ ios:
+ pluginClass: FLTPathProviderPlugin
+ macos:
+ default_package: path_provider_ohos
+ linux:
+ default_package: path_provider_ohos
+ windows:
+ default_package: path_provider_ohos
+ ohos:
+ default_package: path_provider_ohos
+
+dependencies:
+ flutter:
+ sdk: flutter
+ path_provider_platform_interface: ^2.0.0
+ path_provider_macos: ^2.0.0
+ path_provider_linux: ^2.0.0
+ path_provider_windows: ^2.0.0
+ path_provider_ohos:
+ path: ../path_provider_ohos
+dev_dependencies:
+# integration_test:
+# path: ../../integration_test
+ flutter_test:
+ sdk: flutter
+ flutter_driver:
+ sdk: flutter
+ pedantic: ^1.10.0
+ plugin_platform_interface: ">=1.0.0 <3.0.0"
+ test: ^1.16.0
+
+environment:
+ sdk: ">=2.12.0-259.9.beta <3.0.0"
+ flutter: ">=1.12.13+hotfix.5"
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/AUTHORS b/ohos/test_cached_network_image/lib/path_provider_ohos/AUTHORS
new file mode 100644
index 0000000000000000000000000000000000000000..d6a0ebb6ce1ec5f6713344bf177684cd0372cccf
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/AUTHORS
@@ -0,0 +1,81 @@
+#
+# Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Below is a list of people and organizations that have contributed
+# to the Flutter project. Names should be added to the list like so:
+#
+# Name/Organization
+
+Google Inc.
+The Chromium Authors
+German Saprykin
+Benjamin Sauer
+larsenthomasj@gmail.com
+Ali Bitek
+Pol Batlló
+Anatoly Pulyaevskiy
+Hayden Flinner
+Stefano Rodriguez
+Salvatore Giordano
+Brian Armstrong
+Paul DeMarco
+Fabricio Nogueira
+Simon Lightfoot
+Ashton Thomas
+Thomas Danner
+Diego Velásquez
+Hajime Nakamura
+Tuyển Vũ Xuân
+Miguel Ruivo
+Sarthak Verma
+Mike Diarmid
+Invertase
+Elliot Hesp
+Vince Varga
+Aawaz Gyawali
+EUI Limited
+Katarina Sheremet
+Thomas Stockx
+Sarbagya Dhaubanjar
+Ozkan Eksi
+Rishab Nayak
+ko2ic
+Jonathan Younger
+Jose Sanchez
+Debkanchan Samadder
+Audrius Karosevicius
+Lukasz Piliszczuk
+SoundReply Solutions GmbH
+Rafal Wachol
+Pau Picas
+Christian Weder
+Alexandru Tuca
+Christian Weder
+Rhodes Davis Jr.
+Luigi Agosti
+Quentin Le Guennec
+Koushik Ravikumar
+Nissim Dsilva
+Giancarlo Rocha
+Ryo Miyake
+Théo Champion
+Kazuki Yamaguchi
+Eitan Schwartz
+Chris Rutkowski
+Juan Alvarez
+Aleksandr Yurkovskiy
+Anton Borries
+Alex Li
+Rahul Raj <64.rahulraj@gmail.com>
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/CHANGELOG.md b/ohos/test_cached_network_image/lib/path_provider_ohos/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/README.md b/ohos/test_cached_network_image/lib/path_provider_ohos/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/lib/messages.g.dart b/ohos/test_cached_network_image/lib/path_provider_ohos/lib/messages.g.dart
new file mode 100644
index 0000000000000000000000000000000000000000..b605273a022fb8c4768686a24a1d5cde5d9aab2b
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/lib/messages.g.dart
@@ -0,0 +1,204 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import 'dart:async';
+import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;
+
+import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;
+import 'package:flutter/services.dart';
+
+enum StorageDirectory {
+ root,
+ music,
+ podcasts,
+ ringtones,
+ alarms,
+ notifications,
+ pictures,
+ movies,
+ downloads,
+ dcim,
+ documents,
+}
+
+class PathProviderApi {
+ /// Constructor for [PathProviderApi]. The [binaryMessenger] named argument is
+ /// available for dependency injection. If it is left null, the default
+ /// BinaryMessenger will be used which routes to the host platform.
+ PathProviderApi({BinaryMessenger? binaryMessenger})
+ : _binaryMessenger = binaryMessenger;
+ final BinaryMessenger? _binaryMessenger;
+
+ static const MessageCodec codec = StandardMessageCodec();
+
+ Future getTemporaryPath() async {
+ final BasicMessageChannel channel = BasicMessageChannel(
+ 'dev.flutter.pigeon.PathProviderApi.getTemporaryPath', codec,
+ binaryMessenger: _binaryMessenger);
+ final List? replyList = await channel.send(" ") as List?;
+ if (replyList == null) {
+ throw PlatformException(
+ code: 'channel-error',
+ message: 'Unable to establish connection on channel.',
+ );
+ } else if (replyList.length > 1) {
+ throw PlatformException(
+ code: replyList[0]! as String,
+ message: replyList[1] as String?,
+ details: replyList[2],
+ );
+ } else {
+ return (replyList[0] as String?);
+ }
+ }
+
+ Future getApplicationSupportPath() async {
+ final BasicMessageChannel channel = BasicMessageChannel(
+ 'dev.flutter.pigeon.PathProviderApi.getApplicationSupportPath', codec,
+ binaryMessenger: _binaryMessenger);
+ final List? replyList = await channel.send(" ") as List?;
+ if (replyList == null) {
+ throw PlatformException(
+ code: 'channel-error',
+ message: 'Unable to establish connection on channel.',
+ );
+ } else if (replyList.length > 1) {
+ throw PlatformException(
+ code: replyList[0]! as String,
+ message: replyList[1] as String?,
+ details: replyList[2],
+ );
+ } else {
+ return (replyList[0] as String?);
+ }
+ }
+
+ Future getApplicationDocumentsPath() async {
+ final BasicMessageChannel channel = BasicMessageChannel(
+ 'dev.flutter.pigeon.PathProviderApi.getApplicationDocumentsPath', codec,
+ binaryMessenger: _binaryMessenger);
+ final List? replyList = await channel.send(" ") as List?;
+ if (replyList == null) {
+ throw PlatformException(
+ code: 'channel-error',
+ message: 'Unable to establish connection on channel.',
+ );
+ } else if (replyList.length > 1) {
+ throw PlatformException(
+ code: replyList[0]! as String,
+ message: replyList[1] as String?,
+ details: replyList[2],
+ );
+ } else {
+ return (replyList[0] as String?);
+ }
+ }
+
+ Future getApplicationCachePath() async {
+ final BasicMessageChannel channel = BasicMessageChannel(
+ 'dev.flutter.pigeon.PathProviderApi.getApplicationCachePath', codec,
+ binaryMessenger: _binaryMessenger);
+ final List? replyList = await channel.send(null) as List?;
+ if (replyList == null) {
+ throw PlatformException(
+ code: 'channel-error',
+ message: 'Unable to establish connection on channel.',
+ );
+ } else if (replyList.length > 1) {
+ throw PlatformException(
+ code: replyList[0]! as String,
+ message: replyList[1] as String?,
+ details: replyList[2],
+ );
+ } else {
+ return (replyList[0] as String?);
+ }
+ }
+
+ Future getExternalStoragePath() async {
+ final BasicMessageChannel channel = BasicMessageChannel(
+ 'dev.flutter.pigeon.PathProviderApi.getExternalStoragePath', codec,
+ binaryMessenger: _binaryMessenger);
+ final List? replyList = await channel.send(" ") as List?;
+ if (replyList == null) {
+ throw PlatformException(
+ code: 'channel-error',
+ message: 'Unable to establish connection on channel.',
+ );
+ } else if (replyList.length > 1) {
+ throw PlatformException(
+ code: replyList[0]! as String,
+ message: replyList[1] as String?,
+ details: replyList[2],
+ );
+ } else {
+ return (replyList[0] as String?);
+ }
+ }
+
+ Future> getExternalCachePaths() async {
+ final BasicMessageChannel channel = BasicMessageChannel(
+ 'dev.flutter.pigeon.PathProviderApi.getExternalCachePaths', codec,
+ binaryMessenger: _binaryMessenger);
+ final List? replyList = await channel.send(" ") as List?;
+ if (replyList == null) {
+ throw PlatformException(
+ code: 'channel-error',
+ message: 'Unable to establish connection on channel.',
+ );
+ } else if (replyList.length > 1) {
+ throw PlatformException(
+ code: replyList[0]! as String,
+ message: replyList[1] as String?,
+ details: replyList[2],
+ );
+ } else if (replyList[0] == null) {
+ throw PlatformException(
+ code: 'null-error',
+ message: 'Host platform returned null value for non-null return value.',
+ );
+ } else {
+ return (replyList[0] as List?)!.cast();
+ }
+ }
+
+ Future> getExternalStoragePaths(
+ StorageDirectory arg_directory) async {
+ final BasicMessageChannel channel = BasicMessageChannel(
+ 'dev.flutter.pigeon.PathProviderApi.getExternalStoragePaths', codec,
+ binaryMessenger: _binaryMessenger);
+ final List? replyList =
+ await channel.send([arg_directory.index]) as List?;
+ if (replyList == null) {
+ throw PlatformException(
+ code: 'channel-error',
+ message: 'Unable to establish connection on channel.',
+ );
+ } else if (replyList.length > 1) {
+ throw PlatformException(
+ code: replyList[0]! as String,
+ message: replyList[1] as String?,
+ details: replyList[2],
+ );
+ } else if (replyList[0] == null) {
+ throw PlatformException(
+ code: 'null-error',
+ message: 'Host platform returned null value for non-null return value.',
+ );
+ } else {
+ return (replyList[0] as List?)!.cast();
+ }
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/lib/path_provider_ohos.dart b/ohos/test_cached_network_image/lib/path_provider_ohos/lib/path_provider_ohos.dart
new file mode 100644
index 0000000000000000000000000000000000000000..62a2051832acae8667740e017065b3c4c9bde545
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/lib/path_provider_ohos.dart
@@ -0,0 +1,103 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
+import 'messages.g.dart' as messages;
+
+messages.StorageDirectory _convertStorageDirectory(
+ StorageDirectory? directory) {
+ switch (directory) {
+ case null:
+ return messages.StorageDirectory.root;
+ case StorageDirectory.music:
+ return messages.StorageDirectory.music;
+ case StorageDirectory.podcasts:
+ return messages.StorageDirectory.podcasts;
+ case StorageDirectory.ringtones:
+ return messages.StorageDirectory.ringtones;
+ case StorageDirectory.alarms:
+ return messages.StorageDirectory.alarms;
+ case StorageDirectory.notifications:
+ return messages.StorageDirectory.notifications;
+ case StorageDirectory.pictures:
+ return messages.StorageDirectory.pictures;
+ case StorageDirectory.movies:
+ return messages.StorageDirectory.movies;
+ case StorageDirectory.downloads:
+ return messages.StorageDirectory.downloads;
+ case StorageDirectory.dcim:
+ return messages.StorageDirectory.dcim;
+ case StorageDirectory.documents:
+ return messages.StorageDirectory.documents;
+ }
+}
+
+/// The OHOS implementation of [PathProviderPlatform].
+class PathProviderOhos extends PathProviderPlatform {
+ final messages.PathProviderApi _api = messages.PathProviderApi();
+
+ /// Registers this class as the default instance of [PathProviderPlatform].
+ static void registerWith() {
+ PathProviderPlatform.instance = PathProviderOhos();
+ }
+
+ @override
+ Future getTemporaryPath() {
+ return _api.getTemporaryPath();
+ }
+
+ @override
+ Future getApplicationSupportPath() {
+ return _api.getApplicationSupportPath();
+ }
+
+ @override
+ Future getLibraryPath() {
+ throw UnsupportedError('getLibraryPath is not supported on OHOS');
+ }
+
+ @override
+ Future getApplicationDocumentsPath() {
+ return _api.getApplicationDocumentsPath();
+ }
+
+ @override
+ Future getApplicationCachePath() {
+ return _api.getApplicationCachePath();
+ }
+
+ @override
+ Future getExternalStoragePath() {
+ return _api.getExternalStoragePath();
+ }
+
+ @override
+ Future?> getExternalCachePaths() async {
+ return (await _api.getExternalCachePaths()).cast();
+ }
+
+ @override
+ Future?> getExternalStoragePaths({
+ StorageDirectory? type,
+ }) async {
+ return (await _api.getExternalStoragePaths(_convertStorageDirectory(type)))
+ .cast();
+ }
+
+ @override
+ Future getDownloadsPath() {
+ throw UnsupportedError('getDownloadsPath is not supported on OHOS');
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/cache/file-cache.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/cache/file-cache.json
new file mode 100644
index 0000000000000000000000000000000000000000..1e922e7e1fc28adb088df43e96d59e2e64598bf0
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/cache/file-cache.json
@@ -0,0 +1 @@
+{"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\AppScope\\app.json5":{"hashValue":"c5cbb5522de13fac82f033c7cd9b48d8","name":"app.json5","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\AppScope\\app.json5","type":"file","isSymbolicLink":false,"fileMetaData":{"size":226,"lastModifiedTime":1695632211627}},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\module.json5":{"hashValue":"1b4eb7b03f613b971199abeae1d7ad6d","name":"module.json5","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\module.json5","type":"file","isSymbolicLink":false,"fileMetaData":{"size":137,"lastModifiedTime":1695632211699}},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\oh-package.json5":{"hashValue":"c55207f83ac823903369a4a9dab86116","name":"oh-package.json5","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\oh-package.json5","type":"file","isSymbolicLink":false,"fileMetaData":{"size":269,"lastModifiedTime":1695632211699}},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\merge_profile\\default\\module.json":{"hashValue":"c7280466cd6cb30364af8cbdfe11f350","name":"module.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\merge_profile\\default\\module.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":406,"lastModifiedTime":1698044664828}},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\process_profile\\default\\module.json":{"hashValue":"1c8e8a915a9b7f222d4cf94722d1bb42","name":"module.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\process_profile\\default\\module.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":491,"lastModifiedTime":1698044664928}},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\resConfig.json":{"hashValue":"d1d25a5d183601133bbabec3842873ac","name":"resConfig.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\resConfig.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":1161,"lastModifiedTime":1697686151232}},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\libs":{"hashValue":"fb414dab48788ac59123df55cae63f0b","name":"libs","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\libs","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"2a8cdcb7a112ce8f608fa4c5a8b26644","name":"flutter_ohos.har","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\libs\\flutter_ohos.har","type":"file","isSymbolicLink":false,"fileMetaData":{"size":19163432,"lastModifiedTime":1698044260416}}]},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\libs\\default":{"hashValue":"","name":"default","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\libs\\default","type":"directory","isSymbolicLink":false,"children":[]},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources":{"hashValue":"c8b0c1d9d5adf5ad1facbc15311568c7","name":"resources","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"0e99451c368710b3fd660c4ce26f9f1a","name":"base","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\base","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d6b3b638c405a120e2d4c2749281c244","name":"element","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\base\\element","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"729a44cdc4bfe4a33860e45f85edc23d","name":"string.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\base\\element\\string.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}}]}]},{"hashValue":"0e99451c368710b3fd660c4ce26f9f1a","name":"en_US","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\en_US","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d6b3b638c405a120e2d4c2749281c244","name":"element","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\en_US\\element","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"729a44cdc4bfe4a33860e45f85edc23d","name":"string.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\en_US\\element\\string.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}}]}]},{"hashValue":"0e99451c368710b3fd660c4ce26f9f1a","name":"zh_CN","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\zh_CN","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d6b3b638c405a120e2d4c2749281c244","name":"element","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\zh_CN\\element","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"729a44cdc4bfe4a33860e45f85edc23d","name":"string.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\zh_CN\\element\\string.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}}]}]}]},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default":{"hashValue":"76f5c8d078ca69ae9175830aa99a05dc","name":"default","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"f12d653569ed3cffc2c73dbcf141b3e7","name":"ids_map","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\ids_map","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"fde1d32f9d3798179b3345d3d3b044a8","name":"id_defined.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\ids_map\\id_defined.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":148,"lastModifiedTime":1698044665019}}]},{"hashValue":"2ed40cf3b6a0258fcf7ef0d5663211d7","name":"module.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\module.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":652,"lastModifiedTime":1698044665018}},{"hashValue":"d1d25a5d183601133bbabec3842873ac","name":"resConfig.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\resConfig.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":1161,"lastModifiedTime":1697686151232}},{"hashValue":"98c2ba5b20a7da7409087b816f0988e8","name":"resources.index","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\resources.index","type":"file","isSymbolicLink":false,"fileMetaData":{"size":396,"lastModifiedTime":1698044665018}},{"hashValue":"94cde23849d24d7b4c50116f9d63d725","name":"ResourceTable.txt","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\ResourceTable.txt","type":"file","isSymbolicLink":false,"fileMetaData":{"size":27,"lastModifiedTime":1698044665018}}]},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\generated\\r\\default\\ResourceTable.h":{"hashValue":"d021dd9a3167074553dba4f2c5854465","name":"ResourceTable.h","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\generated\\r\\default\\ResourceTable.h","type":"file","isSymbolicLink":false,"fileMetaData":{"size":750,"lastModifiedTime":1698044665015}},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\generated\\r\\default":{"hashValue":"93721c69ae9a43a6b6b026ce4ba28ad2","name":"default","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\generated\\r\\default","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d021dd9a3167074553dba4f2c5854465","name":"ResourceTable.h","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\generated\\r\\default\\ResourceTable.h","type":"file","isSymbolicLink":false,"fileMetaData":{"size":750,"lastModifiedTime":1698044665015}}]},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\merge_profile\\default":{"hashValue":"de5eea44e80e5ff634766ec94c928117","name":"default","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\merge_profile\\default","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"c7280466cd6cb30364af8cbdfe11f350","name":"module.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\merge_profile\\default\\module.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":406,"lastModifiedTime":1698044664828}}]},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider":{"hashValue":"7190fb2c4d706ed6e0e4babda37414da","name":"path_provider","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"19d5ec875e8653c8b6be599c08514ccb","name":"hvigorfile.ts","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\hvigorfile.ts","type":"file","isSymbolicLink":false,"fileMetaData":{"size":160,"lastModifiedTime":1695632211630}},{"hashValue":"c55207f83ac823903369a4a9dab86116","name":"oh-package.json5","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\oh-package.json5","type":"file","isSymbolicLink":false,"fileMetaData":{"size":269,"lastModifiedTime":1695632211699}},{"hashValue":"dd38cfe42b111fd0bc58052c7bc17c51","name":"src","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"3a65d298f5e72b2d44c536dcdc681eab","name":"main","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"f02f1982d32aa94a70d44596e261b365","name":"ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\ets","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"9eda77fcd81df492830297a66f19de2b","name":"io","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\ets\\io","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"a8b6bfcaad196674574a9a19f821f053","name":"flutter","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\ets\\io\\flutter","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"c3f2123de992ed2dbd349c42faa6bf94","name":"plugins","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\ets\\io\\flutter\\plugins","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"a73ddceefee53bd0ac6011fe311e4c5b","name":"pathprovider","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\ets\\io\\flutter\\plugins\\pathprovider","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"3eba56cb57824fbfc070408312f41c09","name":"Messages.ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\ets\\io\\flutter\\plugins\\pathprovider\\Messages.ets","type":"file","isSymbolicLink":false,"fileMetaData":{"size":7545,"lastModifiedTime":1698027170940}},{"hashValue":"0ec1d5dd6a98d7b451807b34d6eaec32","name":"PathProviderPlugin.ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\ets\\io\\flutter\\plugins\\pathprovider\\PathProviderPlugin.ets","type":"file","isSymbolicLink":false,"fileMetaData":{"size":4706,"lastModifiedTime":1698027170931}}]}]}]}]}]},{"hashValue":"1b4eb7b03f613b971199abeae1d7ad6d","name":"module.json5","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\module.json5","type":"file","isSymbolicLink":false,"fileMetaData":{"size":137,"lastModifiedTime":1695632211699}},{"hashValue":"c8b0c1d9d5adf5ad1facbc15311568c7","name":"resources","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"0e99451c368710b3fd660c4ce26f9f1a","name":"base","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\base","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d6b3b638c405a120e2d4c2749281c244","name":"element","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\base\\element","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"729a44cdc4bfe4a33860e45f85edc23d","name":"string.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\base\\element\\string.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}}]}]},{"hashValue":"0e99451c368710b3fd660c4ce26f9f1a","name":"en_US","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\en_US","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d6b3b638c405a120e2d4c2749281c244","name":"element","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\en_US\\element","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"729a44cdc4bfe4a33860e45f85edc23d","name":"string.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\en_US\\element\\string.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}}]}]},{"hashValue":"0e99451c368710b3fd660c4ce26f9f1a","name":"zh_CN","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\zh_CN","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d6b3b638c405a120e2d4c2749281c244","name":"element","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\zh_CN\\element","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"729a44cdc4bfe4a33860e45f85edc23d","name":"string.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources\\zh_CN\\element\\string.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}}]}]}]}]},{"hashValue":"b07684f7777a2f703cac0fec56862a66","name":"test","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\test","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"c78a7b9e8f82f2213f5b0350ab7252e5","name":"List.test.ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\test\\List.test.ets","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}},{"hashValue":"ec0cecaf2909eb7b848a158a2786add5","name":"LocalUnit.test.ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\test\\LocalUnit.test.ets","type":"file","isSymbolicLink":false,"fileMetaData":{"size":1692,"lastModifiedTime":1695632211699}}]}]}]},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\ResourceTable.txt":{"hashValue":"94cde23849d24d7b4c50116f9d63d725","name":"ResourceTable.txt","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\ResourceTable.txt","type":"file","isSymbolicLink":false,"fileMetaData":{"size":27,"lastModifiedTime":1698044665018}},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar":{"hashValue":"77ec3ff3075d1e1b0f77eea3593fc54a","name":"default@PackageHar","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"34bdaa94e55567ca04e39d0ddc512301","name":"build-profile.json5","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\build-profile.json5","type":"file","isSymbolicLink":false,"fileMetaData":{"size":119,"lastModifiedTime":1695632211630}},{"hashValue":"19d5ec875e8653c8b6be599c08514ccb","name":"hvigorfile.ts","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\hvigorfile.ts","type":"file","isSymbolicLink":false,"fileMetaData":{"size":160,"lastModifiedTime":1695632211630}},{"hashValue":"","name":"libs","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\libs","type":"directory","isSymbolicLink":false,"children":[]},{"hashValue":"c55207f83ac823903369a4a9dab86116","name":"oh-package.json5","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\oh-package.json5","type":"file","isSymbolicLink":false,"fileMetaData":{"size":269,"lastModifiedTime":1695632211699}},{"hashValue":"94cde23849d24d7b4c50116f9d63d725","name":"ResourceTable.txt","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\ResourceTable.txt","type":"file","isSymbolicLink":false,"fileMetaData":{"size":27,"lastModifiedTime":1698044665018}},{"hashValue":"ae45559de2480bc70d782647539c87a9","name":"src","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d1732197995c7f8e834be72e56bec866","name":"main","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"f02f1982d32aa94a70d44596e261b365","name":"ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\ets","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"9eda77fcd81df492830297a66f19de2b","name":"io","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\ets\\io","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"a8b6bfcaad196674574a9a19f821f053","name":"flutter","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\ets\\io\\flutter","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"c3f2123de992ed2dbd349c42faa6bf94","name":"plugins","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\ets\\io\\flutter\\plugins","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"a73ddceefee53bd0ac6011fe311e4c5b","name":"pathprovider","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\ets\\io\\flutter\\plugins\\pathprovider","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"3eba56cb57824fbfc070408312f41c09","name":"Messages.ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\ets\\io\\flutter\\plugins\\pathprovider\\Messages.ets","type":"file","isSymbolicLink":false,"fileMetaData":{"size":7545,"lastModifiedTime":1698027170940}},{"hashValue":"0ec1d5dd6a98d7b451807b34d6eaec32","name":"PathProviderPlugin.ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\ets\\io\\flutter\\plugins\\pathprovider\\PathProviderPlugin.ets","type":"file","isSymbolicLink":false,"fileMetaData":{"size":4706,"lastModifiedTime":1698027170931}}]}]}]}]}]},{"hashValue":"c7280466cd6cb30364af8cbdfe11f350","name":"module.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\module.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":406,"lastModifiedTime":1698044664828}},{"hashValue":"c8b0c1d9d5adf5ad1facbc15311568c7","name":"resources","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"0e99451c368710b3fd660c4ce26f9f1a","name":"base","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources\\base","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d6b3b638c405a120e2d4c2749281c244","name":"element","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources\\base\\element","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"729a44cdc4bfe4a33860e45f85edc23d","name":"string.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources\\base\\element\\string.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}}]}]},{"hashValue":"0e99451c368710b3fd660c4ce26f9f1a","name":"en_US","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources\\en_US","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d6b3b638c405a120e2d4c2749281c244","name":"element","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources\\en_US\\element","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"729a44cdc4bfe4a33860e45f85edc23d","name":"string.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources\\en_US\\element\\string.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}}]}]},{"hashValue":"0e99451c368710b3fd660c4ce26f9f1a","name":"zh_CN","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources\\zh_CN","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"d6b3b638c405a120e2d4c2749281c244","name":"element","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources\\zh_CN\\element","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"729a44cdc4bfe4a33860e45f85edc23d","name":"string.json","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\main\\resources\\zh_CN\\element\\string.json","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}}]}]}]}]},{"hashValue":"b07684f7777a2f703cac0fec56862a66","name":"test","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\test","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"c78a7b9e8f82f2213f5b0350ab7252e5","name":"List.test.ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\test\\List.test.ets","type":"file","isSymbolicLink":false,"fileMetaData":{"size":108,"lastModifiedTime":1695632211699}},{"hashValue":"ec0cecaf2909eb7b848a158a2786add5","name":"LocalUnit.test.ets","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar\\src\\test\\LocalUnit.test.ets","type":"file","isSymbolicLink":false,"fileMetaData":{"size":1692,"lastModifiedTime":1695632211699}}]}]}]},"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\outputs\\default":{"hashValue":"876919e92069ce600cf972b0875777f7","name":"default","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\outputs\\default","type":"directory","isSymbolicLink":false,"children":[{"hashValue":"7505492774406aa9fff80dba7d7feac7","name":"path_provider.har","path":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\outputs\\default\\path_provider.har","type":"file","isSymbolicLink":false,"fileMetaData":{"size":3760,"lastModifiedTime":1698044665105}}]}}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/cache/task-cache.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/cache/task-cache.json
new file mode 100644
index 0000000000000000000000000000000000000000..c424f579e9642bd97516da860942f4f330a46bc7
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/cache/task-cache.json
@@ -0,0 +1 @@
+{":ohos:path_provider:default@PreBuild":{"_inputs":[{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_COMMAND\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_ENV\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_TOOLCHAIN\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"apiType\",\"_value\":\"stageMode\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"codeType\",\"_value\":true,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"compatibleApiVersion\",\"_value\":10,\"_valueType\":\"number\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"compileApiVersion\",\"_value\":10,\"_valueType\":\"number\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"customTypes\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"deviceType\",\"_value\":[\"default\",\"tablet\"],\"_valueType\":\"object\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"isSupportOhpmProj\",\"_value\":true,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"profileModuleName\",\"_value\":\"path_provider\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"sdkToolchainsComponentVersion\",\"_value\":\"4.0.0.40\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"targetStatusCode\",\"_value\":2,\"_valueType\":\"number\"}"}],"_successful":true,"_projectName":"ohos","_moduleName":"path_provider","_taskName":"default@PreBuild","_key":":ohos:path_provider:default@PreBuild","_executionId":":ohos:path_provider:default@PreBuild:1698044664739","_inputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\AppScope\\app.json5",{"isDirectory":false,"fileSnapShotHashValue":"c5cbb5522de13fac82f033c7cd9b48d8"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\module.json5",{"isDirectory":false,"fileSnapShotHashValue":"1b4eb7b03f613b971199abeae1d7ad6d"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\oh-package.json5",{"fileSnapShotHashValue":"c55207f83ac823903369a4a9dab86116"}]]},"_outputFiles":{"dataType":"Map","value":[]}},":ohos:path_provider:default@MergeProfile":{"_inputs":[{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_COMMAND\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_ENV\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_TOOLCHAIN\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"asanEnable\",\"_value\":false,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"buildRoot\",\"_value\":\"build\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"compatibleSdkVersion\",\"_value\":10,\"_valueType\":\"number\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"isDebug\",\"_value\":true,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"isHarModule\",\"_value\":true,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"multiProjects\",\"_value\":false,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"releaseType\",\"_value\":\"Release\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"targetSdkVersion\",\"_value\":10,\"_valueType\":\"number\"}"}],"_successful":true,"_projectName":"ohos","_moduleName":"path_provider","_taskName":"default@MergeProfile","_key":":ohos:path_provider:default@MergeProfile","_executionId":":ohos:path_provider:default@MergeProfile:1698044664825","_inputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\AppScope\\app.json5",{"fileSnapShotHashValue":"c5cbb5522de13fac82f033c7cd9b48d8"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\module.json5",{"fileSnapShotHashValue":"1b4eb7b03f613b971199abeae1d7ad6d"}]]},"_outputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\merge_profile\\default\\module.json",{"fileSnapShotHashValue":"c7280466cd6cb30364af8cbdfe11f350"}]]}},":ohos:path_provider:default@ProcessProfile":{"_inputs":[{"dataType":"ValueEntry","value":"{\"_name\":\"arkEnable\",\"_value\":true,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"compileMode\",\"_value\":\"esmodule\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"deviceTypes\",\"_value\":[\"default\",\"tablet\"],\"_valueType\":\"object\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"dependency\",\"_value\":\"[]\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_COMMAND\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_TOOLCHAIN\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_ENV\",\"_value\":\"\",\"_valueType\":\"string\"}"}],"_successful":true,"_projectName":"ohos","_moduleName":"path_provider","_taskName":"default@ProcessProfile","_key":":ohos:path_provider:default@ProcessProfile","_executionId":":ohos:path_provider:default@ProcessProfile:1698044664829","_inputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\merge_profile\\default\\module.json",{"fileSnapShotHashValue":"c7280466cd6cb30364af8cbdfe11f350"}]]},"_outputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\process_profile\\default\\module.json",{"fileSnapShotHashValue":"1c8e8a915a9b7f222d4cf94722d1bb42"}]]}},":ohos:path_provider:default@ProcessResource":{"_inputs":[{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_COMMAND\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_ENV\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_TOOLCHAIN\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"resConfigJsonContent\",\"_value\":\"{\\\"configPath\\\":\\\"D:\\\\\\\\project\\\\\\\\flutter-sig-package\\\\\\\\packages\\\\\\\\packages\\\\\\\\path_provider\\\\\\\\path_provider_ohos\\\\\\\\ohos\\\\\\\\path_provider\\\\\\\\build\\\\\\\\default\\\\\\\\intermediates\\\\\\\\process_profile\\\\\\\\default\\\\\\\\module.json\\\",\\\"packageName\\\":\\\"io.flutter.plugins.pathprovider\\\",\\\"output\\\":\\\"D:\\\\\\\\project\\\\\\\\flutter-sig-package\\\\\\\\packages\\\\\\\\packages\\\\\\\\path_provider\\\\\\\\path_provider_ohos\\\\\\\\ohos\\\\\\\\path_provider\\\\\\\\build\\\\\\\\default\\\\\\\\intermediates\\\\\\\\res\\\\\\\\default\\\",\\\"moduleNames\\\":\\\"path_provider\\\",\\\"ResourceTable\\\":[\\\"D:\\\\\\\\project\\\\\\\\flutter-sig-package\\\\\\\\packages\\\\\\\\packages\\\\\\\\path_provider\\\\\\\\path_provider_ohos\\\\\\\\ohos\\\\\\\\path_provider\\\\\\\\build\\\\\\\\default\\\\\\\\generated\\\\\\\\r\\\\\\\\default\\\\\\\\ResourceTable.h\\\"],\\\"moduleResources\\\":[\\\"D:\\\\\\\\project\\\\\\\\flutter-sig-package\\\\\\\\packages\\\\\\\\packages\\\\\\\\path_provider\\\\\\\\path_provider_ohos\\\\\\\\ohos\\\\\\\\path_provider\\\\\\\\src\\\\\\\\main\\\\\\\\resources\\\"],\\\"dependencies\\\":[],\\\"ids\\\":\\\"D:\\\\\\\\project\\\\\\\\flutter-sig-package\\\\\\\\packages\\\\\\\\packages\\\\\\\\path_provider\\\\\\\\path_provider_ohos\\\\\\\\ohos\\\\\\\\path_provider\\\\\\\\build\\\\\\\\default\\\\\\\\intermediates\\\\\\\\res\\\\\\\\default\\\\\\\\ids_map\\\",\\\"definedIds\\\":\\\"D:\\\\\\\\project\\\\\\\\flutter-sig-package\\\\\\\\packages\\\\\\\\packages\\\\\\\\path_provider\\\\\\\\path_provider_ohos\\\\\\\\ohos\\\\\\\\path_provider\\\\\\\\build\\\\\\\\default\\\\\\\\intermediates\\\\\\\\res\\\\\\\\default\\\\\\\\ids_map\\\\\\\\id_defined.json\\\"}\",\"_valueType\":\"string\"}"}],"_successful":true,"_projectName":"ohos","_moduleName":"path_provider","_taskName":"default@ProcessResource","_key":":ohos:path_provider:default@ProcessResource","_executionId":":ohos:path_provider:default@ProcessResource:1697686151230","_inputFiles":{"dataType":"Map","value":[]},"_outputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\resConfig.json",{"isDirectory":false,"fileSnapShotHashValue":"d1d25a5d183601133bbabec3842873ac"}]]}},":ohos:path_provider:default@ProcessLibs":{"_inputs":[{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_COMMAND\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_TOOLCHAIN\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_ENV\",\"_value\":\"\",\"_valueType\":\"string\"}"}],"_successful":true,"_projectName":"ohos","_moduleName":"path_provider","_taskName":"default@ProcessLibs","_key":":ohos:path_provider:default@ProcessLibs","_executionId":":ohos:path_provider:default@ProcessLibs:1698044664930","_inputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\libs",{"isDirectory":true,"fileSnapShotHashValue":"fb414dab48788ac59123df55cae63f0b"}]]},"_outputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\libs\\default",{"isDirectory":true,"fileSnapShotHashValue":""}]]}},":ohos:path_provider:default@CompileResource":{"_inputs":[{"dataType":"ValueEntry","value":"{\"_name\":\"TARGET_CONFIG\",\"_value\":\"{\\\"name\\\":\\\"default\\\"}\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_COMMAND\",\"_value\":\"D:\\\\tools\\\\devecostudio-windows-4.0.3.601\\\\devecostudio-windows-4.0.3.601\\\\sdk\\\\WinSDK\\\\openharmony\\\\10\\\\toolchains\\\\restool.exe,-l,D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\build\\\\default\\\\intermediates\\\\res\\\\default\\\\resConfig.json\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_TOOLCHAIN\",\"_value\":\"D:\\\\tools\\\\devecostudio-windows-4.0.3.601\\\\devecostudio-windows-4.0.3.601\\\\sdk\\\\WinSDK\\\\openharmony\\\\10\\\\toolchains\\\\restool.exe\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_ENV\",\"_value\":\"\",\"_valueType\":\"string\"}"}],"_successful":true,"_projectName":"ohos","_moduleName":"path_provider","_taskName":"default@CompileResource","_key":":ohos:path_provider:default@CompileResource","_executionId":":ohos:path_provider:default@CompileResource:1698044664937","_inputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources",{"fileSnapShotHashValue":"c8b0c1d9d5adf5ad1facbc15311568c7"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\process_profile\\default\\module.json",{"isDirectory":false,"fileSnapShotHashValue":"1c8e8a915a9b7f222d4cf94722d1bb42"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\resConfig.json",{"isDirectory":false,"fileSnapShotHashValue":"d1d25a5d183601133bbabec3842873ac"}]]},"_outputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default",{"isDirectory":true,"fileSnapShotHashValue":"76f5c8d078ca69ae9175830aa99a05dc"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\generated\\r\\default\\ResourceTable.h",{"isDirectory":false,"fileSnapShotHashValue":"d021dd9a3167074553dba4f2c5854465"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\generated\\r\\default",{"isDirectory":true,"fileSnapShotHashValue":"93721c69ae9a43a6b6b026ce4ba28ad2"}]]}},":ohos:path_provider:default@PackageHar":{"_inputs":[{"dataType":"ValueEntry","value":"{\"_name\":\"hasNativeOption\",\"_value\":false,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"needCppTypes\",\"_value\":false,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"harModuleJson\",\"_value\":\"D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\build\\\\default\\\\cache\\\\default\\\\default@PackageHar\\\\src\\\\main\\\\module.json5\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"isOhpmProject\",\"_value\":true,\"_valueType\":\"boolean\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"artifactType\",\"_value\":\"original\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_COMMAND\",\"_value\":\"C:\\\\Users\\\\z30010942\\\\nodejs\\\\npm.cmd,pack\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_TOOLCHAIN\",\"_value\":\"\",\"_valueType\":\"string\"}"},{"dataType":"ValueEntry","value":"{\"_name\":\"BUILTIN_TASK_ENV\",\"_value\":\"cwd:D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\build\\\\default\\\\cache\\\\default\\\\default@PackageHar;\",\"_valueType\":\"string\"}"}],"_successful":true,"_projectName":"ohos","_moduleName":"path_provider","_taskName":"default@PackageHar","_key":":ohos:path_provider:default@PackageHar","_executionId":":ohos:path_provider:default@PackageHar:1698044665025","_inputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\merge_profile\\default",{"isDirectory":true,"fileSnapShotHashValue":"de5eea44e80e5ff634766ec94c928117"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider",{"isDirectory":true,"test":{"dataType":"RegExp","value":"^(?!D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\libs|D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\build|D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\node_modules|D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\oh_modules|D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\.cxx|D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\.previewer|D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\.hvigor|D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\.gitignore|D:\\\\project\\\\flutter-sig-package\\\\packages\\\\packages\\\\path_provider\\\\path_provider_ohos\\\\ohos\\\\path_provider\\\\.ohpmignore).*"},"fileSnapShotHashValue":"7190fb2c4d706ed6e0e4babda37414da"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\libs\\default",{"isDirectory":true,"fileSnapShotHashValue":""}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\ResourceTable.txt",{"isDirectory":false,"fileSnapShotHashValue":"94cde23849d24d7b4c50116f9d63d725"}]]},"_outputFiles":{"dataType":"Map","value":[["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@PackageHar",{"isDirectory":true,"fileSnapShotHashValue":"77ec3ff3075d1e1b0f77eea3593fc54a"}],["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\outputs\\default",{"isDirectory":true,"fileSnapShotHashValue":"876919e92069ce600cf972b0875777f7"}]]}}}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/outputs/logs/details/details.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/outputs/logs/details/details.json
new file mode 100644
index 0000000000000000000000000000000000000000..e55e21ac77968038ea81d662bea7ef034aa7b14b
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/outputs/logs/details/details.json
@@ -0,0 +1,16 @@
+{
+ "totalTime": 481506500,
+ "moduleNum": 1,
+ "taskTime": {
+ "compileArkTS": 0,
+ "buildArkTS": 0,
+ "compileJS": 0,
+ "buildJS": 0,
+ "compileResource": 0,
+ "packageHap": 0,
+ "signHap": 0
+ },
+ "isIncremental": true,
+ "hasIncremental": false,
+ "isParallel": true
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/outputs/sync/output.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/outputs/sync/output.json
new file mode 100644
index 0000000000000000000000000000000000000000..ca06e5bb15cfd13c1535a1a9f14d0141af5ebbf3
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/outputs/sync/output.json
@@ -0,0 +1,39 @@
+{
+ "ohos-module-path_provider": {
+ "SELECT_TARGET": "default",
+ "MODULE_BUILD_DIR": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build",
+ "TARGETS": {
+ "default": {
+ "SOURCE_ROOT": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\src\\main",
+ "RESOURCES_PATH": [
+ "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources"
+ ],
+ "BUILD_PATH": {
+ "OUTPUT_PATH": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\outputs\\default",
+ "INTERMEDIA_PATH": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates",
+ "JS_ASSETS_PATH": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\loader_out\\default",
+ "JS_LITE_ASSETS_PATH": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\loader_out_lite\\default",
+ "RES_PATH": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default",
+ "RES_PROFILE_PATH": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\resources\\base\\profile",
+ "ETS_SUPER_VISUAL_PATH": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@CompileArkTS\\esmodule",
+ "JS_SUPER_VISUAL_PATH": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\cache\\default\\default@CompileJS\\jsbundle",
+ "WORKER_LOADER": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\loader\\default\\loader.json",
+ "MANIFEST_JSON": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\manifest\\default",
+ "OUTPUT_METADATA_JSON": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\hap_metadata\\default\\output_metadata.json"
+ },
+ "BUILD_OPTION": {
+ "debuggable": true
+ }
+ }
+ }
+ },
+ "ohos-project": {
+ "SELECT_PRODUCT_NAME": "default",
+ "MODULE_BUILD_DIR": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\build",
+ "BUNDLE_NAME": "io.flutter.plugins.pathprovider",
+ "BUILD_PATH": {
+ "OUTPUT_PATH": "C:\\Users\\hched\\Desktop\\path_provider_ohos\\ohos\\build\\outputs\\default"
+ }
+ },
+ "version": 1
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/report/report.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/report/report.json
new file mode 100644
index 0000000000000000000000000000000000000000..c812c2d046ee61ce12cbc028f21d33e82ac413a1
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/.hvigor/report/report.json
@@ -0,0 +1,31 @@
+{
+ "version": "1.0",
+ "workerIdList": [
+ -1
+ ],
+ "metrics": [
+ {
+ "type": "build_line",
+ "endTime": 1699407048308,
+ "status": "closed",
+ "children": [],
+ "name": "overallTime",
+ "taskName": "init",
+ "taskPath": "path_provider",
+ "workerId": -1,
+ "startTime": 1699407048307
+ },
+ {
+ "type": "build_line",
+ "endTime": 1699407048309,
+ "status": "closed",
+ "children": [],
+ "name": "overallTime",
+ "taskName": "init",
+ "taskPath": "ohos",
+ "workerId": -1,
+ "startTime": 1699407048309
+ }
+ ],
+ "workLog": []
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/AppScope/app.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/AppScope/app.json5
new file mode 100644
index 0000000000000000000000000000000000000000..68d6882c192e3684e2e9e50a05846b4839fff894
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/AppScope/app.json5
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "app": {
+ "bundleName": "io.flutter.plugins.pathprovider",
+ "vendor": "example",
+ "versionCode": 1000000,
+ "versionName": "1.0.0",
+ "icon": "$media:app_icon",
+ "label": "$string:app_name"
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/AppScope/resources/base/element/string.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/AppScope/resources/base/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..553ced4f7ebe2ed3fca66c4ef9637ce3ad65d12e
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/AppScope/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "path_provider"
+ }
+ ]
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/AppScope/resources/base/media/app_icon.png b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/AppScope/resources/base/media/app_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c
Binary files /dev/null and b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/AppScope/resources/base/media/app_icon.png differ
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/build-profile.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/build-profile.json5
new file mode 100644
index 0000000000000000000000000000000000000000..5c1e5d53d93e28d421dca80f583fc79b3f2ef772
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/build-profile.json5
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "app": {
+ "signingConfigs": [
+ {
+ "name": "default",
+ "material": {
+ "certpath": "C:\\Users\\hched\\.ohos\\config\\openharmony\\auto_ohos_default_ohos_io.flutter.plugins.pathprovider.cer",
+ "storePassword": "0000001A14E9D3E5C4DF2ED15CED1A37B72F435E8D176F43E415FF2213D4C9C753FA62E51E4621A952A5",
+ "keyAlias": "debugKey",
+ "keyPassword": "0000001AC6F51F5DA12538489C8E00F23C111099A8622DA17D8D6B2FE7A456D4D2D21C903D3DEB198EC9",
+ "profile": "C:\\Users\\hched\\.ohos\\config\\openharmony\\auto_ohos_default_ohos_io.flutter.plugins.pathprovider.p7b",
+ "signAlg": "SHA256withECDSA",
+ "storeFile": "C:\\Users\\hched\\.ohos\\config\\openharmony\\auto_ohos_default_ohos_io.flutter.plugins.pathprovider.p12"
+ }
+ }
+ ],
+ "products": [
+ {
+ "name": "default",
+ "signingConfig": "default",
+ "compileSdkVersion": "4.0.0(10)",
+ "compatibleSdkVersion": "4.0.0(10)",
+ "runtimeOS": "HarmonyOS",
+ }
+ ],
+ "buildModeSet": [
+ {
+ "name": "debug",
+ },
+ {
+ "name": "release"
+ }
+ ]
+ },
+ "modules": [
+ {
+ "name": "path_provider",
+ "srcPath": "./path_provider"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/dependencies/hvigor-2.3.0-s.tgz b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/dependencies/hvigor-2.3.0-s.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..34029f16ff4dcdd4931f187a618d35d2d8641c88
Binary files /dev/null and b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/dependencies/hvigor-2.3.0-s.tgz differ
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/dependencies/hvigor-ohos-plugin-2.3.0-s.tgz b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/dependencies/hvigor-ohos-plugin-2.3.0-s.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..8e028e66b8d9dd720787fe2b0ae340d0f933877d
Binary files /dev/null and b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/dependencies/hvigor-ohos-plugin-2.3.0-s.tgz differ
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/dependencies/rollup.tgz b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/dependencies/rollup.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..4d5d24f65ce03f6ac01d019209ca669d8eb8369a
Binary files /dev/null and b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/dependencies/rollup.tgz differ
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigor/hvigor-config.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigor/hvigor-config.json5
new file mode 100644
index 0000000000000000000000000000000000000000..71e363a4f754b90a3153a9f2e98c7d27ce776978
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigor/hvigor-config.json5
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+{
+ "hvigorVersion": "file:../dependencies/hvigor-2.3.0-s.tgz",
+ "dependencies": {
+ "@ohos/hvigor-ohos-plugin": "file:../dependencies/hvigor-ohos-plugin-2.3.0-s.tgz",
+ "rollup": "file:../dependencies/rollup.tgz",
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigor/hvigor-wrapper.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigor/hvigor-wrapper.js
new file mode 100644
index 0000000000000000000000000000000000000000..ce46aa6fa02c8e8e049a7e85ee0b3d708046567d
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigor/hvigor-wrapper.js
@@ -0,0 +1,17 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+"use strict";var e=require("fs"),t=require("path"),n=require("os"),r=require("crypto"),u=require("child_process"),o=require("constants"),i=require("stream"),s=require("util"),c=require("assert"),a=require("tty"),l=require("zlib"),f=require("net");function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var D=d(e),p=d(t),E=d(n),m=d(r),h=d(u),y=d(o),C=d(i),F=d(s),g=d(c),A=d(a),v=d(l),S=d(f),w="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},O={},b={},_={},B=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(_,"__esModule",{value:!0}),_.isMac=_.isLinux=_.isWindows=void 0;const P=B(E.default),k="Windows_NT",x="Linux",N="Darwin";_.isWindows=function(){return P.default.type()===k},_.isLinux=function(){return P.default.type()===x},_.isMac=function(){return P.default.type()===N};var I={},T=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),R=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),M=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&T(t,e,n);return R(t,e),t};Object.defineProperty(I,"__esModule",{value:!0}),I.hash=void 0;const L=M(m.default);I.hash=function(e,t="md5"){return L.createHash(t).update(e,"utf-8").digest("hex")},function(e){var t=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),n=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var u in e)"default"!==u&&Object.prototype.hasOwnProperty.call(e,u)&&t(r,e,u);return n(r,e),r};Object.defineProperty(e,"__esModule",{value:!0}),e.HVIGOR_BOOT_JS_FILE_PATH=e.HVIGOR_PROJECT_DEPENDENCY_PACKAGE_JSON_PATH=e.HVIGOR_PROJECT_DEPENDENCIES_HOME=e.HVIGOR_PROJECT_WRAPPER_HOME=e.HVIGOR_PROJECT_NAME=e.HVIGOR_PROJECT_ROOT_DIR=e.HVIGOR_PROJECT_CACHES_HOME=e.HVIGOR_PNPM_STORE_PATH=e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=e.HVIGOR_WRAPPER_TOOLS_HOME=e.HVIGOR_USER_HOME=e.DEFAULT_PACKAGE_JSON=e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME=e.PNPM=e.HVIGOR=e.NPM_TOOL=e.PNPM_TOOL=e.HVIGOR_ENGINE_PACKAGE_NAME=void 0;const u=r(p.default),o=r(E.default),i=_,s=I;e.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",e.PNPM_TOOL=(0,i.isWindows)()?"pnpm.cmd":"pnpm",e.NPM_TOOL=(0,i.isWindows)()?"npm.cmd":"npm",e.HVIGOR="hvigor",e.PNPM="pnpm",e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME="hvigor-config.json5",e.DEFAULT_PACKAGE_JSON="package.json",e.HVIGOR_USER_HOME=u.resolve(o.homedir(),".hvigor"),e.HVIGOR_WRAPPER_TOOLS_HOME=u.resolve(e.HVIGOR_USER_HOME,"wrapper","tools"),e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=u.resolve(e.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",e.PNPM_TOOL),e.HVIGOR_PNPM_STORE_PATH=u.resolve(e.HVIGOR_USER_HOME,"caches"),e.HVIGOR_PROJECT_CACHES_HOME=u.resolve(e.HVIGOR_USER_HOME,"project_caches"),e.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),e.HVIGOR_PROJECT_NAME=u.basename((0,s.hash)(e.HVIGOR_PROJECT_ROOT_DIR)),e.HVIGOR_PROJECT_WRAPPER_HOME=u.resolve(e.HVIGOR_PROJECT_ROOT_DIR,e.HVIGOR),e.HVIGOR_PROJECT_DEPENDENCIES_HOME=u.resolve(e.HVIGOR_PROJECT_CACHES_HOME,e.HVIGOR_PROJECT_NAME,"workspace"),e.HVIGOR_PROJECT_DEPENDENCY_PACKAGE_JSON_PATH=u.resolve(e.HVIGOR_PROJECT_DEPENDENCIES_HOME,e.DEFAULT_PACKAGE_JSON),e.HVIGOR_BOOT_JS_FILE_PATH=u.resolve(e.HVIGOR_PROJECT_DEPENDENCIES_HOME,"node_modules","@ohos","hvigor","bin","hvigor.js")}(b);var j={},$={};Object.defineProperty($,"__esModule",{value:!0}),$.logInfoPrintConsole=$.logErrorAndExit=void 0,$.logErrorAndExit=function(e){e instanceof Error?console.error(e.message):console.error(e),process.exit(-1)},$.logInfoPrintConsole=function(e){console.log(e)};var H=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),J=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),G=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&H(t,e,n);return J(t,e),t},V=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(j,"__esModule",{value:!0}),j.isFileExists=j.offlinePluginConversion=j.executeCommand=j.getNpmPath=j.hasNpmPackInPaths=void 0;const U=h.default,W=G(p.default),z=b,K=$,q=V(D.default);j.hasNpmPackInPaths=function(e,t){try{return require.resolve(e,{paths:[...t]}),!0}catch(e){return!1}},j.getNpmPath=function(){const e=process.execPath;return W.join(W.dirname(e),z.NPM_TOOL)},j.executeCommand=function(e,t,n){0!==(0,U.spawnSync)(e,t,n).status&&(0,K.logErrorAndExit)(`Error: ${e} ${t} execute failed.See above for details.`)},j.offlinePluginConversion=function(e,t){return t.startsWith("file:")||t.endsWith(".tgz")?W.resolve(e,z.HVIGOR,t.replace("file:","")):t},j.isFileExists=function(e){return q.default.existsSync(e)&&q.default.statSync(e).isFile()},function(e){var t=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),n=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var u in e)"default"!==u&&Object.prototype.hasOwnProperty.call(e,u)&&t(r,e,u);return n(r,e),r},u=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.executeInstallPnpm=e.isPnpmAvailable=e.environmentHandler=e.checkNpmConifg=e.PNPM_VERSION=void 0;const o=r(D.default),i=b,s=j,c=r(p.default),a=$,l=h.default,f=u(E.default);e.PNPM_VERSION="7.30.0",e.checkNpmConifg=function(){const e=c.resolve(i.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),t=c.resolve(f.default.homedir(),".npmrc");if((0,s.isFileExists)(e)||(0,s.isFileExists)(t))return;const n=(0,s.getNpmPath)(),r=(0,l.spawnSync)(n,["config","get","prefix"],{cwd:i.HVIGOR_PROJECT_ROOT_DIR});if(0!==r.status||!r.stdout)return void(0,a.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const u=c.resolve(`${r.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,s.isFileExists)(u)||(0,a.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},e.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},e.isPnpmAvailable=function(){return!!o.existsSync(i.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,s.hasNpmPackInPaths)("pnpm",[i.HVIGOR_WRAPPER_TOOLS_HOME])},e.executeInstallPnpm=function(){(0,a.logInfoPrintConsole)(`Installing pnpm@${e.PNPM_VERSION}...`);const t=(0,s.getNpmPath)();!function(){const t=c.resolve(i.HVIGOR_WRAPPER_TOOLS_HOME,i.DEFAULT_PACKAGE_JSON);try{o.existsSync(i.HVIGOR_WRAPPER_TOOLS_HOME)||o.mkdirSync(i.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const n={dependencies:{}};n.dependencies[i.PNPM]=e.PNPM_VERSION,o.writeFileSync(t,JSON.stringify(n))}catch(e){(0,a.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${t} failed.`)}}(),(0,s.executeCommand)(t,["install","pnpm"],{cwd:i.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,a.logInfoPrintConsole)("Pnpm install success.")}}(O);var Y={},X={},Z={},Q={};Object.defineProperty(Q,"__esModule",{value:!0}),Q.Unicode=void 0;class ee{}Q.Unicode=ee,ee.Space_Separator=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ee.ID_Start=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,ee.ID_Continue=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,Object.defineProperty(Z,"__esModule",{value:!0}),Z.JudgeUtil=void 0;const te=Q;Z.JudgeUtil=class{static isIgnoreChar(e){return"string"==typeof e&&("\t"===e||"\v"===e||"\f"===e||" "===e||" "===e||"\ufeff"===e||"\n"===e||"\r"===e||"\u2028"===e||"\u2029"===e)}static isSpaceSeparator(e){return"string"==typeof e&&te.Unicode.Space_Separator.test(e)}static isIdStartChar(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||"$"===e||"_"===e||te.Unicode.ID_Start.test(e))}static isIdContinueChar(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||"$"===e||"_"===e||""===e||""===e||te.Unicode.ID_Continue.test(e))}static isDigitWithoutZero(e){return/[1-9]/.test(e)}static isDigit(e){return"string"==typeof e&&/[0-9]/.test(e)}static isHexDigit(e){return"string"==typeof e&&/[0-9A-Fa-f]/.test(e)}};var ne={},re={fromCallback:function(e){return Object.defineProperty((function(...t){if("function"!=typeof t[t.length-1])return new Promise(((n,r)=>{e.call(this,...t,((e,t)=>null!=e?r(e):n(t)))}));e.apply(this,t)}),"name",{value:e.name})},fromPromise:function(e){return Object.defineProperty((function(...t){const n=t[t.length-1];if("function"!=typeof n)return e.apply(this,t);e.apply(this,t.slice(0,-1)).then((e=>n(null,e)),n)}),"name",{value:e.name})}},ue=y.default,oe=process.cwd,ie=null,se=process.env.GRACEFUL_FS_PLATFORM||process.platform;process.cwd=function(){return ie||(ie=oe.call(process)),ie};try{process.cwd()}catch(e){}if("function"==typeof process.chdir){var ce=process.chdir;process.chdir=function(e){ie=null,ce.call(process,e)},Object.setPrototypeOf&&Object.setPrototypeOf(process.chdir,ce)}var ae=function(e){ue.hasOwnProperty("O_SYMLINK")&&process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)&&function(e){e.lchmod=function(t,n,r){e.open(t,ue.O_WRONLY|ue.O_SYMLINK,n,(function(t,u){t?r&&r(t):e.fchmod(u,n,(function(t){e.close(u,(function(e){r&&r(t||e)}))}))}))},e.lchmodSync=function(t,n){var r,u=e.openSync(t,ue.O_WRONLY|ue.O_SYMLINK,n),o=!0;try{r=e.fchmodSync(u,n),o=!1}finally{if(o)try{e.closeSync(u)}catch(e){}else e.closeSync(u)}return r}}(e);e.lutimes||function(e){ue.hasOwnProperty("O_SYMLINK")&&e.futimes?(e.lutimes=function(t,n,r,u){e.open(t,ue.O_SYMLINK,(function(t,o){t?u&&u(t):e.futimes(o,n,r,(function(t){e.close(o,(function(e){u&&u(t||e)}))}))}))},e.lutimesSync=function(t,n,r){var u,o=e.openSync(t,ue.O_SYMLINK),i=!0;try{u=e.futimesSync(o,n,r),i=!1}finally{if(i)try{e.closeSync(o)}catch(e){}else e.closeSync(o)}return u}):e.futimes&&(e.lutimes=function(e,t,n,r){r&&process.nextTick(r)},e.lutimesSync=function(){})}(e);e.chown=r(e.chown),e.fchown=r(e.fchown),e.lchown=r(e.lchown),e.chmod=t(e.chmod),e.fchmod=t(e.fchmod),e.lchmod=t(e.lchmod),e.chownSync=u(e.chownSync),e.fchownSync=u(e.fchownSync),e.lchownSync=u(e.lchownSync),e.chmodSync=n(e.chmodSync),e.fchmodSync=n(e.fchmodSync),e.lchmodSync=n(e.lchmodSync),e.stat=o(e.stat),e.fstat=o(e.fstat),e.lstat=o(e.lstat),e.statSync=i(e.statSync),e.fstatSync=i(e.fstatSync),e.lstatSync=i(e.lstatSync),e.chmod&&!e.lchmod&&(e.lchmod=function(e,t,n){n&&process.nextTick(n)},e.lchmodSync=function(){});e.chown&&!e.lchown&&(e.lchown=function(e,t,n,r){r&&process.nextTick(r)},e.lchownSync=function(){});"win32"===se&&(e.rename="function"!=typeof e.rename?e.rename:function(t){function n(n,r,u){var o=Date.now(),i=0;t(n,r,(function s(c){if(c&&("EACCES"===c.code||"EPERM"===c.code||"EBUSY"===c.code)&&Date.now()-o<6e4)return setTimeout((function(){e.stat(r,(function(e,o){e&&"ENOENT"===e.code?t(n,r,s):u(c)}))}),i),void(i<100&&(i+=10));u&&u(c)}))}return Object.setPrototypeOf&&Object.setPrototypeOf(n,t),n}(e.rename));function t(t){return t?function(n,r,u){return t.call(e,n,r,(function(e){s(e)&&(e=null),u&&u.apply(this,arguments)}))}:t}function n(t){return t?function(n,r){try{return t.call(e,n,r)}catch(e){if(!s(e))throw e}}:t}function r(t){return t?function(n,r,u,o){return t.call(e,n,r,u,(function(e){s(e)&&(e=null),o&&o.apply(this,arguments)}))}:t}function u(t){return t?function(n,r,u){try{return t.call(e,n,r,u)}catch(e){if(!s(e))throw e}}:t}function o(t){return t?function(n,r,u){function o(e,t){t&&(t.uid<0&&(t.uid+=4294967296),t.gid<0&&(t.gid+=4294967296)),u&&u.apply(this,arguments)}return"function"==typeof r&&(u=r,r=null),r?t.call(e,n,r,o):t.call(e,n,o)}:t}function i(t){return t?function(n,r){var u=r?t.call(e,n,r):t.call(e,n);return u&&(u.uid<0&&(u.uid+=4294967296),u.gid<0&&(u.gid+=4294967296)),u}:t}function s(e){return!e||("ENOSYS"===e.code||!(process.getuid&&0===process.getuid()||"EINVAL"!==e.code&&"EPERM"!==e.code))}e.read="function"!=typeof e.read?e.read:function(t){function n(n,r,u,o,i,s){var c;if(s&&"function"==typeof s){var a=0;c=function(l,f,d){if(l&&"EAGAIN"===l.code&&a<10)return a++,t.call(e,n,r,u,o,i,c);s.apply(this,arguments)}}return t.call(e,n,r,u,o,i,c)}return Object.setPrototypeOf&&Object.setPrototypeOf(n,t),n}(e.read),e.readSync="function"!=typeof e.readSync?e.readSync:(c=e.readSync,function(t,n,r,u,o){for(var i=0;;)try{return c.call(e,t,n,r,u,o)}catch(e){if("EAGAIN"===e.code&&i<10){i++;continue}throw e}});var c};var le=C.default.Stream,fe=function(e){return{ReadStream:function t(n,r){if(!(this instanceof t))return new t(n,r);le.call(this);var u=this;this.path=n,this.fd=null,this.readable=!0,this.paused=!1,this.flags="r",this.mode=438,this.bufferSize=65536,r=r||{};for(var o=Object.keys(r),i=0,s=o.length;ithis.end)throw new Error("start must be <= end");this.pos=this.start}if(null!==this.fd)return void process.nextTick((function(){u._read()}));e.open(this.path,this.flags,this.mode,(function(e,t){if(e)return u.emit("error",e),void(u.readable=!1);u.fd=t,u.emit("open",t),u._read()}))},WriteStream:function t(n,r){if(!(this instanceof t))return new t(n,r);le.call(this),this.path=n,this.fd=null,this.writable=!0,this.flags="w",this.encoding="binary",this.mode=438,this.bytesWritten=0,r=r||{};for(var u=Object.keys(r),o=0,i=u.length;o= zero");this.pos=this.start}this.busy=!1,this._queue=[],null===this.fd&&(this._open=e.open,this._queue.push([this._open,this.path,this.flags,this.mode,void 0]),this.flush())}}};var de=function(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Object)var t={__proto__:De(e)};else t=Object.create(null);return Object.getOwnPropertyNames(e).forEach((function(n){Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(e,n))})),t},De=Object.getPrototypeOf||function(e){return e.__proto__};var pe,Ee,me=D.default,he=ae,ye=fe,Ce=de,Fe=F.default;function ge(e,t){Object.defineProperty(e,pe,{get:function(){return t}})}"function"==typeof Symbol&&"function"==typeof Symbol.for?(pe=Symbol.for("graceful-fs.queue"),Ee=Symbol.for("graceful-fs.previous")):(pe="___graceful-fs.queue",Ee="___graceful-fs.previous");var Ae=function(){};if(Fe.debuglog?Ae=Fe.debuglog("gfs4"):/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&(Ae=function(){var e=Fe.format.apply(Fe,arguments);e="GFS4: "+e.split(/\n/).join("\nGFS4: "),console.error(e)}),!me[pe]){var ve=w[pe]||[];ge(me,ve),me.close=function(e){function t(t,n){return e.call(me,t,(function(e){e||_e(),"function"==typeof n&&n.apply(this,arguments)}))}return Object.defineProperty(t,Ee,{value:e}),t}(me.close),me.closeSync=function(e){function t(t){e.apply(me,arguments),_e()}return Object.defineProperty(t,Ee,{value:e}),t}(me.closeSync),/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&process.on("exit",(function(){Ae(me[pe]),g.default.equal(me[pe].length,0)}))}w[pe]||ge(w,me[pe]);var Se,we=Oe(Ce(me));function Oe(e){he(e),e.gracefulify=Oe,e.createReadStream=function(t,n){return new e.ReadStream(t,n)},e.createWriteStream=function(t,n){return new e.WriteStream(t,n)};var t=e.readFile;e.readFile=function(e,n,r){"function"==typeof n&&(r=n,n=null);return function e(n,r,u,o){return t(n,r,(function(t){!t||"EMFILE"!==t.code&&"ENFILE"!==t.code?"function"==typeof u&&u.apply(this,arguments):be([e,[n,r,u],t,o||Date.now(),Date.now()])}))}(e,n,r)};var n=e.writeFile;e.writeFile=function(e,t,r,u){"function"==typeof r&&(u=r,r=null);return function e(t,r,u,o,i){return n(t,r,u,(function(n){!n||"EMFILE"!==n.code&&"ENFILE"!==n.code?"function"==typeof o&&o.apply(this,arguments):be([e,[t,r,u,o],n,i||Date.now(),Date.now()])}))}(e,t,r,u)};var r=e.appendFile;r&&(e.appendFile=function(e,t,n,u){"function"==typeof n&&(u=n,n=null);return function e(t,n,u,o,i){return r(t,n,u,(function(r){!r||"EMFILE"!==r.code&&"ENFILE"!==r.code?"function"==typeof o&&o.apply(this,arguments):be([e,[t,n,u,o],r,i||Date.now(),Date.now()])}))}(e,t,n,u)});var u=e.copyFile;u&&(e.copyFile=function(e,t,n,r){"function"==typeof n&&(r=n,n=0);return function e(t,n,r,o,i){return u(t,n,r,(function(u){!u||"EMFILE"!==u.code&&"ENFILE"!==u.code?"function"==typeof o&&o.apply(this,arguments):be([e,[t,n,r,o],u,i||Date.now(),Date.now()])}))}(e,t,n,r)});var o=e.readdir;e.readdir=function(e,t,n){"function"==typeof t&&(n=t,t=null);var r=i.test(process.version)?function(e,t,n,r){return o(e,u(e,t,n,r))}:function(e,t,n,r){return o(e,t,u(e,t,n,r))};return r(e,t,n);function u(e,t,n,u){return function(o,i){!o||"EMFILE"!==o.code&&"ENFILE"!==o.code?(i&&i.sort&&i.sort(),"function"==typeof n&&n.call(this,o,i)):be([r,[e,t,n],o,u||Date.now(),Date.now()])}}};var i=/^v[0-5]\./;if("v0.8"===process.version.substr(0,4)){var s=ye(e);d=s.ReadStream,D=s.WriteStream}var c=e.ReadStream;c&&(d.prototype=Object.create(c.prototype),d.prototype.open=function(){var e=this;E(e.path,e.flags,e.mode,(function(t,n){t?(e.autoClose&&e.destroy(),e.emit("error",t)):(e.fd=n,e.emit("open",n),e.read())}))});var a=e.WriteStream;a&&(D.prototype=Object.create(a.prototype),D.prototype.open=function(){var e=this;E(e.path,e.flags,e.mode,(function(t,n){t?(e.destroy(),e.emit("error",t)):(e.fd=n,e.emit("open",n))}))}),Object.defineProperty(e,"ReadStream",{get:function(){return d},set:function(e){d=e},enumerable:!0,configurable:!0}),Object.defineProperty(e,"WriteStream",{get:function(){return D},set:function(e){D=e},enumerable:!0,configurable:!0});var l=d;Object.defineProperty(e,"FileReadStream",{get:function(){return l},set:function(e){l=e},enumerable:!0,configurable:!0});var f=D;function d(e,t){return this instanceof d?(c.apply(this,arguments),this):d.apply(Object.create(d.prototype),arguments)}function D(e,t){return this instanceof D?(a.apply(this,arguments),this):D.apply(Object.create(D.prototype),arguments)}Object.defineProperty(e,"FileWriteStream",{get:function(){return f},set:function(e){f=e},enumerable:!0,configurable:!0});var p=e.open;function E(e,t,n,r){return"function"==typeof n&&(r=n,n=null),function e(t,n,r,u,o){return p(t,n,r,(function(i,s){!i||"EMFILE"!==i.code&&"ENFILE"!==i.code?"function"==typeof u&&u.apply(this,arguments):be([e,[t,n,r,u],i,o||Date.now(),Date.now()])}))}(e,t,n,r)}return e.open=E,e}function be(e){Ae("ENQUEUE",e[0].name,e[1]),me[pe].push(e),Be()}function _e(){for(var e=Date.now(),t=0;t2&&(me[pe][t][3]=e,me[pe][t][4]=e);Be()}function Be(){if(clearTimeout(Se),Se=void 0,0!==me[pe].length){var e=me[pe].shift(),t=e[0],n=e[1],r=e[2],u=e[3],o=e[4];if(void 0===u)Ae("RETRY",t.name,n),t.apply(null,n);else if(Date.now()-u>=6e4){Ae("TIMEOUT",t.name,n);var i=n.pop();"function"==typeof i&&i.call(null,r)}else{var s=Date.now()-o,c=Math.max(o-u,1);s>=Math.min(1.2*c,100)?(Ae("RETRY",t.name,n),t.apply(null,n.concat([u]))):me[pe].push(e)}void 0===Se&&(Se=setTimeout(Be,0))}}process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!me.__patched&&(we=Oe(me),me.__patched=!0),function(e){const t=re.fromCallback,n=we,r=["access","appendFile","chmod","chown","close","copyFile","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchmod","lchown","link","lstat","mkdir","mkdtemp","open","opendir","readdir","readFile","readlink","realpath","rename","rm","rmdir","stat","symlink","truncate","unlink","utimes","writeFile"].filter((e=>"function"==typeof n[e]));Object.assign(e,n),r.forEach((r=>{e[r]=t(n[r])})),e.realpath.native=t(n.realpath.native),e.exists=function(e,t){return"function"==typeof t?n.exists(e,t):new Promise((t=>n.exists(e,t)))},e.read=function(e,t,r,u,o,i){return"function"==typeof i?n.read(e,t,r,u,o,i):new Promise(((i,s)=>{n.read(e,t,r,u,o,((e,t,n)=>{if(e)return s(e);i({bytesRead:t,buffer:n})}))}))},e.write=function(e,t,...r){return"function"==typeof r[r.length-1]?n.write(e,t,...r):new Promise(((u,o)=>{n.write(e,t,...r,((e,t,n)=>{if(e)return o(e);u({bytesWritten:t,buffer:n})}))}))},"function"==typeof n.writev&&(e.writev=function(e,t,...r){return"function"==typeof r[r.length-1]?n.writev(e,t,...r):new Promise(((u,o)=>{n.writev(e,t,...r,((e,t,n)=>{if(e)return o(e);u({bytesWritten:t,buffers:n})}))}))})}(ne);var Pe={},ke={};const xe=p.default;ke.checkPath=function(e){if("win32"===process.platform){if(/[<>:"|?*]/.test(e.replace(xe.parse(e).root,""))){const t=new Error(`Path contains invalid characters: ${e}`);throw t.code="EINVAL",t}}};const Ne=ne,{checkPath:Ie}=ke,Te=e=>"number"==typeof e?e:{mode:511,...e}.mode;Pe.makeDir=async(e,t)=>(Ie(e),Ne.mkdir(e,{mode:Te(t),recursive:!0})),Pe.makeDirSync=(e,t)=>(Ie(e),Ne.mkdirSync(e,{mode:Te(t),recursive:!0}));const Re=re.fromPromise,{makeDir:Me,makeDirSync:Le}=Pe,je=Re(Me);var $e={mkdirs:je,mkdirsSync:Le,mkdirp:je,mkdirpSync:Le,ensureDir:je,ensureDirSync:Le};const He=re.fromPromise,Je=ne;var Ge={pathExists:He((function(e){return Je.access(e).then((()=>!0)).catch((()=>!1))})),pathExistsSync:Je.existsSync};const Ve=we;var Ue=function(e,t,n,r){Ve.open(e,"r+",((e,u)=>{if(e)return r(e);Ve.futimes(u,t,n,(e=>{Ve.close(u,(t=>{r&&r(e||t)}))}))}))},We=function(e,t,n){const r=Ve.openSync(e,"r+");return Ve.futimesSync(r,t,n),Ve.closeSync(r)};const ze=ne,Ke=p.default,qe=F.default;function Ye(e,t,n){const r=n.dereference?e=>ze.stat(e,{bigint:!0}):e=>ze.lstat(e,{bigint:!0});return Promise.all([r(e),r(t).catch((e=>{if("ENOENT"===e.code)return null;throw e}))]).then((([e,t])=>({srcStat:e,destStat:t})))}function Xe(e,t){return t.ino&&t.dev&&t.ino===e.ino&&t.dev===e.dev}function Ze(e,t){const n=Ke.resolve(e).split(Ke.sep).filter((e=>e)),r=Ke.resolve(t).split(Ke.sep).filter((e=>e));return n.reduce(((e,t,n)=>e&&r[n]===t),!0)}function Qe(e,t,n){return`Cannot ${n} '${e}' to a subdirectory of itself, '${t}'.`}var et={checkPaths:function(e,t,n,r,u){qe.callbackify(Ye)(e,t,r,((r,o)=>{if(r)return u(r);const{srcStat:i,destStat:s}=o;if(s){if(Xe(i,s)){const r=Ke.basename(e),o=Ke.basename(t);return"move"===n&&r!==o&&r.toLowerCase()===o.toLowerCase()?u(null,{srcStat:i,destStat:s,isChangingCase:!0}):u(new Error("Source and destination must not be the same."))}if(i.isDirectory()&&!s.isDirectory())return u(new Error(`Cannot overwrite non-directory '${t}' with directory '${e}'.`));if(!i.isDirectory()&&s.isDirectory())return u(new Error(`Cannot overwrite directory '${t}' with non-directory '${e}'.`))}return i.isDirectory()&&Ze(e,t)?u(new Error(Qe(e,t,n))):u(null,{srcStat:i,destStat:s})}))},checkPathsSync:function(e,t,n,r){const{srcStat:u,destStat:o}=function(e,t,n){let r;const u=n.dereference?e=>ze.statSync(e,{bigint:!0}):e=>ze.lstatSync(e,{bigint:!0}),o=u(e);try{r=u(t)}catch(e){if("ENOENT"===e.code)return{srcStat:o,destStat:null};throw e}return{srcStat:o,destStat:r}}(e,t,r);if(o){if(Xe(u,o)){const r=Ke.basename(e),i=Ke.basename(t);if("move"===n&&r!==i&&r.toLowerCase()===i.toLowerCase())return{srcStat:u,destStat:o,isChangingCase:!0};throw new Error("Source and destination must not be the same.")}if(u.isDirectory()&&!o.isDirectory())throw new Error(`Cannot overwrite non-directory '${t}' with directory '${e}'.`);if(!u.isDirectory()&&o.isDirectory())throw new Error(`Cannot overwrite directory '${t}' with non-directory '${e}'.`)}if(u.isDirectory()&&Ze(e,t))throw new Error(Qe(e,t,n));return{srcStat:u,destStat:o}},checkParentPaths:function e(t,n,r,u,o){const i=Ke.resolve(Ke.dirname(t)),s=Ke.resolve(Ke.dirname(r));if(s===i||s===Ke.parse(s).root)return o();ze.stat(s,{bigint:!0},((i,c)=>i?"ENOENT"===i.code?o():o(i):Xe(n,c)?o(new Error(Qe(t,r,u))):e(t,n,s,u,o)))},checkParentPathsSync:function e(t,n,r,u){const o=Ke.resolve(Ke.dirname(t)),i=Ke.resolve(Ke.dirname(r));if(i===o||i===Ke.parse(i).root)return;let s;try{s=ze.statSync(i,{bigint:!0})}catch(e){if("ENOENT"===e.code)return;throw e}if(Xe(n,s))throw new Error(Qe(t,r,u));return e(t,n,i,u)},isSrcSubdir:Ze,areIdentical:Xe};const tt=we,nt=p.default,rt=$e.mkdirs,ut=Ge.pathExists,ot=Ue,it=et;function st(e,t,n,r,u){const o=nt.dirname(n);ut(o,((i,s)=>i?u(i):s?at(e,t,n,r,u):void rt(o,(o=>o?u(o):at(e,t,n,r,u)))))}function ct(e,t,n,r,u,o){Promise.resolve(u.filter(n,r)).then((i=>i?e(t,n,r,u,o):o()),(e=>o(e)))}function at(e,t,n,r,u){(r.dereference?tt.stat:tt.lstat)(t,((o,i)=>o?u(o):i.isDirectory()?function(e,t,n,r,u,o){return t?Dt(n,r,u,o):function(e,t,n,r,u){tt.mkdir(n,(o=>{if(o)return u(o);Dt(t,n,r,(t=>t?u(t):dt(n,e,u)))}))}(e.mode,n,r,u,o)}(i,e,t,n,r,u):i.isFile()||i.isCharacterDevice()||i.isBlockDevice()?function(e,t,n,r,u,o){return t?function(e,t,n,r,u){if(!r.overwrite)return r.errorOnExist?u(new Error(`'${n}' already exists`)):u();tt.unlink(n,(o=>o?u(o):lt(e,t,n,r,u)))}(e,n,r,u,o):lt(e,n,r,u,o)}(i,e,t,n,r,u):i.isSymbolicLink()?function(e,t,n,r,u){tt.readlink(t,((t,o)=>t?u(t):(r.dereference&&(o=nt.resolve(process.cwd(),o)),e?void tt.readlink(n,((t,i)=>t?"EINVAL"===t.code||"UNKNOWN"===t.code?tt.symlink(o,n,u):u(t):(r.dereference&&(i=nt.resolve(process.cwd(),i)),it.isSrcSubdir(o,i)?u(new Error(`Cannot copy '${o}' to a subdirectory of itself, '${i}'.`)):e.isDirectory()&&it.isSrcSubdir(i,o)?u(new Error(`Cannot overwrite '${i}' with '${o}'.`)):function(e,t,n){tt.unlink(t,(r=>r?n(r):tt.symlink(e,t,n)))}(o,n,u)))):tt.symlink(o,n,u))))}(e,t,n,r,u):i.isSocket()?u(new Error(`Cannot copy a socket file: ${t}`)):i.isFIFO()?u(new Error(`Cannot copy a FIFO pipe: ${t}`)):u(new Error(`Unknown file: ${t}`))))}function lt(e,t,n,r,u){tt.copyFile(t,n,(o=>o?u(o):r.preserveTimestamps?function(e,t,n,r){if(function(e){return 0==(128&e)}(e))return function(e,t,n){return dt(e,128|t,n)}(n,e,(u=>u?r(u):ft(e,t,n,r)));return ft(e,t,n,r)}(e.mode,t,n,u):dt(n,e.mode,u)))}function ft(e,t,n,r){!function(e,t,n){tt.stat(e,((e,r)=>e?n(e):ot(t,r.atime,r.mtime,n)))}(t,n,(t=>t?r(t):dt(n,e,r)))}function dt(e,t,n){return tt.chmod(e,t,n)}function Dt(e,t,n,r){tt.readdir(e,((u,o)=>u?r(u):pt(o,e,t,n,r)))}function pt(e,t,n,r,u){const o=e.pop();return o?function(e,t,n,r,u,o){const i=nt.join(n,t),s=nt.join(r,t);it.checkPaths(i,s,"copy",u,((t,c)=>{if(t)return o(t);const{destStat:a}=c;!function(e,t,n,r,u){r.filter?ct(at,e,t,n,r,u):at(e,t,n,r,u)}(a,i,s,u,(t=>t?o(t):pt(e,n,r,u,o)))}))}(e,o,t,n,r,u):u()}var Et=function(e,t,n,r){"function"!=typeof n||r?"function"==typeof n&&(n={filter:n}):(r=n,n={}),r=r||function(){},(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269"),it.checkPaths(e,t,"copy",n,((u,o)=>{if(u)return r(u);const{srcStat:i,destStat:s}=o;it.checkParentPaths(e,i,t,"copy",(u=>u?r(u):n.filter?ct(st,s,e,t,n,r):st(s,e,t,n,r)))}))};const mt=we,ht=p.default,yt=$e.mkdirsSync,Ct=We,Ft=et;function gt(e,t,n,r){const u=(r.dereference?mt.statSync:mt.lstatSync)(t);if(u.isDirectory())return function(e,t,n,r,u){return t?St(n,r,u):function(e,t,n,r){return mt.mkdirSync(n),St(t,n,r),vt(n,e)}(e.mode,n,r,u)}(u,e,t,n,r);if(u.isFile()||u.isCharacterDevice()||u.isBlockDevice())return function(e,t,n,r,u){return t?function(e,t,n,r){if(r.overwrite)return mt.unlinkSync(n),At(e,t,n,r);if(r.errorOnExist)throw new Error(`'${n}' already exists`)}(e,n,r,u):At(e,n,r,u)}(u,e,t,n,r);if(u.isSymbolicLink())return function(e,t,n,r){let u=mt.readlinkSync(t);r.dereference&&(u=ht.resolve(process.cwd(),u));if(e){let e;try{e=mt.readlinkSync(n)}catch(e){if("EINVAL"===e.code||"UNKNOWN"===e.code)return mt.symlinkSync(u,n);throw e}if(r.dereference&&(e=ht.resolve(process.cwd(),e)),Ft.isSrcSubdir(u,e))throw new Error(`Cannot copy '${u}' to a subdirectory of itself, '${e}'.`);if(mt.statSync(n).isDirectory()&&Ft.isSrcSubdir(e,u))throw new Error(`Cannot overwrite '${e}' with '${u}'.`);return function(e,t){return mt.unlinkSync(t),mt.symlinkSync(e,t)}(u,n)}return mt.symlinkSync(u,n)}(e,t,n,r);if(u.isSocket())throw new Error(`Cannot copy a socket file: ${t}`);if(u.isFIFO())throw new Error(`Cannot copy a FIFO pipe: ${t}`);throw new Error(`Unknown file: ${t}`)}function At(e,t,n,r){return mt.copyFileSync(t,n),r.preserveTimestamps&&function(e,t,n){(function(e){return 0==(128&e)})(e)&&function(e,t){vt(e,128|t)}(n,e);(function(e,t){const n=mt.statSync(e);Ct(t,n.atime,n.mtime)})(t,n)}(e.mode,t,n),vt(n,e.mode)}function vt(e,t){return mt.chmodSync(e,t)}function St(e,t,n){mt.readdirSync(e).forEach((r=>function(e,t,n,r){const u=ht.join(t,e),o=ht.join(n,e),{destStat:i}=Ft.checkPathsSync(u,o,"copy",r);return function(e,t,n,r){if(!r.filter||r.filter(t,n))return gt(e,t,n,r)}(i,u,o,r)}(r,e,t,n)))}var wt=function(e,t,n){"function"==typeof n&&(n={filter:n}),(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269");const{srcStat:r,destStat:u}=Ft.checkPathsSync(e,t,"copy",n);return Ft.checkParentPathsSync(e,r,t,"copy"),function(e,t,n,r){if(r.filter&&!r.filter(t,n))return;const u=ht.dirname(n);mt.existsSync(u)||yt(u);return gt(e,t,n,r)}(u,e,t,n)};var Ot={copy:(0,re.fromCallback)(Et),copySync:wt};const bt=we,_t=p.default,Bt=g.default,Pt="win32"===process.platform;function kt(e){["unlink","chmod","stat","lstat","rmdir","readdir"].forEach((t=>{e[t]=e[t]||bt[t],e[t+="Sync"]=e[t]||bt[t]})),e.maxBusyTries=e.maxBusyTries||3}function xt(e,t,n){let r=0;"function"==typeof t&&(n=t,t={}),Bt(e,"rimraf: missing path"),Bt.strictEqual(typeof e,"string","rimraf: path should be a string"),Bt.strictEqual(typeof n,"function","rimraf: callback function required"),Bt(t,"rimraf: invalid options argument provided"),Bt.strictEqual(typeof t,"object","rimraf: options should be object"),kt(t),Nt(e,t,(function u(o){if(o){if(("EBUSY"===o.code||"ENOTEMPTY"===o.code||"EPERM"===o.code)&&rNt(e,t,u)),100*r)}"ENOENT"===o.code&&(o=null)}n(o)}))}function Nt(e,t,n){Bt(e),Bt(t),Bt("function"==typeof n),t.lstat(e,((r,u)=>r&&"ENOENT"===r.code?n(null):r&&"EPERM"===r.code&&Pt?It(e,t,r,n):u&&u.isDirectory()?Rt(e,t,r,n):void t.unlink(e,(r=>{if(r){if("ENOENT"===r.code)return n(null);if("EPERM"===r.code)return Pt?It(e,t,r,n):Rt(e,t,r,n);if("EISDIR"===r.code)return Rt(e,t,r,n)}return n(r)}))))}function It(e,t,n,r){Bt(e),Bt(t),Bt("function"==typeof r),t.chmod(e,438,(u=>{u?r("ENOENT"===u.code?null:n):t.stat(e,((u,o)=>{u?r("ENOENT"===u.code?null:n):o.isDirectory()?Rt(e,t,n,r):t.unlink(e,r)}))}))}function Tt(e,t,n){let r;Bt(e),Bt(t);try{t.chmodSync(e,438)}catch(e){if("ENOENT"===e.code)return;throw n}try{r=t.statSync(e)}catch(e){if("ENOENT"===e.code)return;throw n}r.isDirectory()?Lt(e,t,n):t.unlinkSync(e)}function Rt(e,t,n,r){Bt(e),Bt(t),Bt("function"==typeof r),t.rmdir(e,(u=>{!u||"ENOTEMPTY"!==u.code&&"EEXIST"!==u.code&&"EPERM"!==u.code?u&&"ENOTDIR"===u.code?r(n):r(u):function(e,t,n){Bt(e),Bt(t),Bt("function"==typeof n),t.readdir(e,((r,u)=>{if(r)return n(r);let o,i=u.length;if(0===i)return t.rmdir(e,n);u.forEach((r=>{xt(_t.join(e,r),t,(r=>{if(!o)return r?n(o=r):void(0==--i&&t.rmdir(e,n))}))}))}))}(e,t,r)}))}function Mt(e,t){let n;kt(t=t||{}),Bt(e,"rimraf: missing path"),Bt.strictEqual(typeof e,"string","rimraf: path should be a string"),Bt(t,"rimraf: missing options"),Bt.strictEqual(typeof t,"object","rimraf: options should be object");try{n=t.lstatSync(e)}catch(n){if("ENOENT"===n.code)return;"EPERM"===n.code&&Pt&&Tt(e,t,n)}try{n&&n.isDirectory()?Lt(e,t,null):t.unlinkSync(e)}catch(n){if("ENOENT"===n.code)return;if("EPERM"===n.code)return Pt?Tt(e,t,n):Lt(e,t,n);if("EISDIR"!==n.code)throw n;Lt(e,t,n)}}function Lt(e,t,n){Bt(e),Bt(t);try{t.rmdirSync(e)}catch(r){if("ENOTDIR"===r.code)throw n;if("ENOTEMPTY"===r.code||"EEXIST"===r.code||"EPERM"===r.code)!function(e,t){if(Bt(e),Bt(t),t.readdirSync(e).forEach((n=>Mt(_t.join(e,n),t))),!Pt){return t.rmdirSync(e,t)}{const n=Date.now();do{try{return t.rmdirSync(e,t)}catch{}}while(Date.now()-n<500)}}(e,t);else if("ENOENT"!==r.code)throw r}}var jt=xt;xt.sync=Mt;const $t=we,Ht=re.fromCallback,Jt=jt;var Gt={remove:Ht((function(e,t){if($t.rm)return $t.rm(e,{recursive:!0,force:!0},t);Jt(e,t)})),removeSync:function(e){if($t.rmSync)return $t.rmSync(e,{recursive:!0,force:!0});Jt.sync(e)}};const Vt=re.fromPromise,Ut=ne,Wt=p.default,zt=$e,Kt=Gt,qt=Vt((async function(e){let t;try{t=await Ut.readdir(e)}catch{return zt.mkdirs(e)}return Promise.all(t.map((t=>Kt.remove(Wt.join(e,t)))))}));function Yt(e){let t;try{t=Ut.readdirSync(e)}catch{return zt.mkdirsSync(e)}t.forEach((t=>{t=Wt.join(e,t),Kt.removeSync(t)}))}var Xt={emptyDirSync:Yt,emptydirSync:Yt,emptyDir:qt,emptydir:qt};const Zt=re.fromCallback,Qt=p.default,en=we,tn=$e;var nn={createFile:Zt((function(e,t){function n(){en.writeFile(e,"",(e=>{if(e)return t(e);t()}))}en.stat(e,((r,u)=>{if(!r&&u.isFile())return t();const o=Qt.dirname(e);en.stat(o,((e,r)=>{if(e)return"ENOENT"===e.code?tn.mkdirs(o,(e=>{if(e)return t(e);n()})):t(e);r.isDirectory()?n():en.readdir(o,(e=>{if(e)return t(e)}))}))}))})),createFileSync:function(e){let t;try{t=en.statSync(e)}catch{}if(t&&t.isFile())return;const n=Qt.dirname(e);try{en.statSync(n).isDirectory()||en.readdirSync(n)}catch(e){if(!e||"ENOENT"!==e.code)throw e;tn.mkdirsSync(n)}en.writeFileSync(e,"")}};const rn=re.fromCallback,un=p.default,on=we,sn=$e,cn=Ge.pathExists,{areIdentical:an}=et;var ln={createLink:rn((function(e,t,n){function r(e,t){on.link(e,t,(e=>{if(e)return n(e);n(null)}))}on.lstat(t,((u,o)=>{on.lstat(e,((u,i)=>{if(u)return u.message=u.message.replace("lstat","ensureLink"),n(u);if(o&&an(i,o))return n(null);const s=un.dirname(t);cn(s,((u,o)=>u?n(u):o?r(e,t):void sn.mkdirs(s,(u=>{if(u)return n(u);r(e,t)}))))}))}))})),createLinkSync:function(e,t){let n;try{n=on.lstatSync(t)}catch{}try{const t=on.lstatSync(e);if(n&&an(t,n))return}catch(e){throw e.message=e.message.replace("lstat","ensureLink"),e}const r=un.dirname(t);return on.existsSync(r)||sn.mkdirsSync(r),on.linkSync(e,t)}};const fn=p.default,dn=we,Dn=Ge.pathExists;var pn={symlinkPaths:function(e,t,n){if(fn.isAbsolute(e))return dn.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:e})));{const r=fn.dirname(t),u=fn.join(r,e);return Dn(u,((t,o)=>t?n(t):o?n(null,{toCwd:u,toDst:e}):dn.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:fn.relative(r,e)})))))}},symlinkPathsSync:function(e,t){let n;if(fn.isAbsolute(e)){if(n=dn.existsSync(e),!n)throw new Error("absolute srcpath does not exist");return{toCwd:e,toDst:e}}{const r=fn.dirname(t),u=fn.join(r,e);if(n=dn.existsSync(u),n)return{toCwd:u,toDst:e};if(n=dn.existsSync(e),!n)throw new Error("relative srcpath does not exist");return{toCwd:e,toDst:fn.relative(r,e)}}}};const En=we;var mn={symlinkType:function(e,t,n){if(n="function"==typeof t?t:n,t="function"!=typeof t&&t)return n(null,t);En.lstat(e,((e,r)=>{if(e)return n(null,"file");t=r&&r.isDirectory()?"dir":"file",n(null,t)}))},symlinkTypeSync:function(e,t){let n;if(t)return t;try{n=En.lstatSync(e)}catch{return"file"}return n&&n.isDirectory()?"dir":"file"}};const hn=re.fromCallback,yn=p.default,Cn=ne,Fn=$e.mkdirs,gn=$e.mkdirsSync,An=pn.symlinkPaths,vn=pn.symlinkPathsSync,Sn=mn.symlinkType,wn=mn.symlinkTypeSync,On=Ge.pathExists,{areIdentical:bn}=et;function _n(e,t,n,r){An(e,t,((u,o)=>{if(u)return r(u);e=o.toDst,Sn(o.toCwd,n,((n,u)=>{if(n)return r(n);const o=yn.dirname(t);On(o,((n,i)=>n?r(n):i?Cn.symlink(e,t,u,r):void Fn(o,(n=>{if(n)return r(n);Cn.symlink(e,t,u,r)}))))}))}))}var Bn={createSymlink:hn((function(e,t,n,r){r="function"==typeof n?n:r,n="function"!=typeof n&&n,Cn.lstat(t,((u,o)=>{!u&&o.isSymbolicLink()?Promise.all([Cn.stat(e),Cn.stat(t)]).then((([u,o])=>{if(bn(u,o))return r(null);_n(e,t,n,r)})):_n(e,t,n,r)}))})),createSymlinkSync:function(e,t,n){let r;try{r=Cn.lstatSync(t)}catch{}if(r&&r.isSymbolicLink()){const n=Cn.statSync(e),r=Cn.statSync(t);if(bn(n,r))return}const u=vn(e,t);e=u.toDst,n=wn(u.toCwd,n);const o=yn.dirname(t);return Cn.existsSync(o)||gn(o),Cn.symlinkSync(e,t,n)}};const{createFile:Pn,createFileSync:kn}=nn,{createLink:xn,createLinkSync:Nn}=ln,{createSymlink:In,createSymlinkSync:Tn}=Bn;var Rn={createFile:Pn,createFileSync:kn,ensureFile:Pn,ensureFileSync:kn,createLink:xn,createLinkSync:Nn,ensureLink:xn,ensureLinkSync:Nn,createSymlink:In,createSymlinkSync:Tn,ensureSymlink:In,ensureSymlinkSync:Tn};var Mn={stringify:function(e,{EOL:t="\n",finalEOL:n=!0,replacer:r=null,spaces:u}={}){const o=n?t:"";return JSON.stringify(e,r,u).replace(/\n/g,t)+o},stripBom:function(e){return Buffer.isBuffer(e)&&(e=e.toString("utf8")),e.replace(/^\uFEFF/,"")}};let Ln;try{Ln=we}catch(e){Ln=D.default}const jn=re,{stringify:$n,stripBom:Hn}=Mn;const Jn=jn.fromPromise((async function(e,t={}){"string"==typeof t&&(t={encoding:t});const n=t.fs||Ln,r=!("throws"in t)||t.throws;let u,o=await jn.fromCallback(n.readFile)(e,t);o=Hn(o);try{u=JSON.parse(o,t?t.reviver:null)}catch(t){if(r)throw t.message=`${e}: ${t.message}`,t;return null}return u}));const Gn=jn.fromPromise((async function(e,t,n={}){const r=n.fs||Ln,u=$n(t,n);await jn.fromCallback(r.writeFile)(e,u,n)}));const Vn={readFile:Jn,readFileSync:function(e,t={}){"string"==typeof t&&(t={encoding:t});const n=t.fs||Ln,r=!("throws"in t)||t.throws;try{let r=n.readFileSync(e,t);return r=Hn(r),JSON.parse(r,t.reviver)}catch(t){if(r)throw t.message=`${e}: ${t.message}`,t;return null}},writeFile:Gn,writeFileSync:function(e,t,n={}){const r=n.fs||Ln,u=$n(t,n);return r.writeFileSync(e,u,n)}};var Un={readJson:Vn.readFile,readJsonSync:Vn.readFileSync,writeJson:Vn.writeFile,writeJsonSync:Vn.writeFileSync};const Wn=re.fromCallback,zn=we,Kn=p.default,qn=$e,Yn=Ge.pathExists;var Xn={outputFile:Wn((function(e,t,n,r){"function"==typeof n&&(r=n,n="utf8");const u=Kn.dirname(e);Yn(u,((o,i)=>o?r(o):i?zn.writeFile(e,t,n,r):void qn.mkdirs(u,(u=>{if(u)return r(u);zn.writeFile(e,t,n,r)}))))})),outputFileSync:function(e,...t){const n=Kn.dirname(e);if(zn.existsSync(n))return zn.writeFileSync(e,...t);qn.mkdirsSync(n),zn.writeFileSync(e,...t)}};const{stringify:Zn}=Mn,{outputFile:Qn}=Xn;var er=async function(e,t,n={}){const r=Zn(t,n);await Qn(e,r,n)};const{stringify:tr}=Mn,{outputFileSync:nr}=Xn;var rr=function(e,t,n){const r=tr(t,n);nr(e,r,n)};const ur=re.fromPromise,or=Un;or.outputJson=ur(er),or.outputJsonSync=rr,or.outputJSON=or.outputJson,or.outputJSONSync=or.outputJsonSync,or.writeJSON=or.writeJson,or.writeJSONSync=or.writeJsonSync,or.readJSON=or.readJson,or.readJSONSync=or.readJsonSync;var ir=or;const sr=we,cr=p.default,ar=Ot.copy,lr=Gt.remove,fr=$e.mkdirp,dr=Ge.pathExists,Dr=et;function pr(e,t,n,r,u){return r?Er(e,t,n,u):n?lr(t,(r=>r?u(r):Er(e,t,n,u))):void dr(t,((r,o)=>r?u(r):o?u(new Error("dest already exists.")):Er(e,t,n,u)))}function Er(e,t,n,r){sr.rename(e,t,(u=>u?"EXDEV"!==u.code?r(u):function(e,t,n,r){const u={overwrite:n,errorOnExist:!0};ar(e,t,u,(t=>t?r(t):lr(e,r)))}(e,t,n,r):r()))}var mr=function(e,t,n,r){"function"==typeof n&&(r=n,n={});const u=n.overwrite||n.clobber||!1;Dr.checkPaths(e,t,"move",n,((n,o)=>{if(n)return r(n);const{srcStat:i,isChangingCase:s=!1}=o;Dr.checkParentPaths(e,i,t,"move",(n=>n?r(n):function(e){const t=cr.dirname(e);return cr.parse(t).root===t}(t)?pr(e,t,u,s,r):void fr(cr.dirname(t),(n=>n?r(n):pr(e,t,u,s,r)))))}))};const hr=we,yr=p.default,Cr=Ot.copySync,Fr=Gt.removeSync,gr=$e.mkdirpSync,Ar=et;function vr(e,t,n){try{hr.renameSync(e,t)}catch(r){if("EXDEV"!==r.code)throw r;return function(e,t,n){const r={overwrite:n,errorOnExist:!0};return Cr(e,t,r),Fr(e)}(e,t,n)}}var Sr=function(e,t,n){const r=(n=n||{}).overwrite||n.clobber||!1,{srcStat:u,isChangingCase:o=!1}=Ar.checkPathsSync(e,t,"move",n);return Ar.checkParentPathsSync(e,u,t,"move"),function(e){const t=yr.dirname(e);return yr.parse(t).root===t}(t)||gr(yr.dirname(t)),function(e,t,n,r){if(r)return vr(e,t,n);if(n)return Fr(t),vr(e,t,n);if(hr.existsSync(t))throw new Error("dest already exists.");return vr(e,t,n)}(e,t,r,o)};var wr,Or,br,_r,Br,Pr={move:(0,re.fromCallback)(mr),moveSync:Sr},kr={...ne,...Ot,...Xt,...Rn,...ir,...$e,...Pr,...Xn,...Ge,...Gt},xr={},Nr={exports:{}},Ir={exports:{}};function Tr(){if(Or)return wr;Or=1;var e=1e3,t=60*e,n=60*t,r=24*n,u=7*r,o=365.25*r;function i(e,t,n,r){var u=t>=1.5*n;return Math.round(e/n)+" "+r+(u?"s":"")}return wr=function(s,c){c=c||{};var a=typeof s;if("string"===a&&s.length>0)return function(i){if((i=String(i)).length>100)return;var s=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(i);if(!s)return;var c=parseFloat(s[1]);switch((s[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*o;case"weeks":case"week":case"w":return c*u;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*n;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(s);if("number"===a&&isFinite(s))return c.long?function(u){var o=Math.abs(u);if(o>=r)return i(u,o,r,"day");if(o>=n)return i(u,o,n,"hour");if(o>=t)return i(u,o,t,"minute");if(o>=e)return i(u,o,e,"second");return u+" ms"}(s):function(u){var o=Math.abs(u);if(o>=r)return Math.round(u/r)+"d";if(o>=n)return Math.round(u/n)+"h";if(o>=t)return Math.round(u/t)+"m";if(o>=e)return Math.round(u/e)+"s";return u+"ms"}(s);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(s))}}function Rr(){if(_r)return br;return _r=1,br=function(e){function t(e){let r,u,o,i=null;function s(...e){if(!s.enabled)return;const n=s,u=Number(new Date),o=u-(r||u);n.diff=o,n.prev=r,n.curr=u,r=u,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let i=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((r,u)=>{if("%%"===r)return"%";i++;const o=t.formatters[u];if("function"==typeof o){const t=e[i];r=o.call(n,t),e.splice(i,1),i--}return r})),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return s.namespace=e,s.useColors=t.useColors(),s.color=t.selectColor(e),s.extend=n,s.destroy=t.destroy,Object.defineProperty(s,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==i?i:(u!==t.namespaces&&(u=t.namespaces,o=t.enabled(e)),o),set:e=>{i=e}}),"function"==typeof t.init&&t.init(s),s}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),u=r.length;for(n=0;n{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t{const n=e.startsWith("-")?"":1===e.length?"-":"--",r=t.indexOf(n+e),u=t.indexOf("--");return-1!==r&&(-1===u||r{}),"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),t.colors=[6,2,3,4,5,1];try{const e=function(){if($r)return jr;$r=1;const e=E.default,t=A.default,n=Vr(),{env:r}=process;let u;function o(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function i(t,o){if(0===u)return 0;if(n("color=16m")||n("color=full")||n("color=truecolor"))return 3;if(n("color=256"))return 2;if(t&&!o&&void 0===u)return 0;const i=u||0;if("dumb"===r.TERM)return i;if("win32"===process.platform){const t=e.release().split(".");return Number(t[0])>=10&&Number(t[2])>=10586?Number(t[2])>=14931?3:2:1}if("CI"in r)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some((e=>e in r))||"codeship"===r.CI_NAME?1:i;if("TEAMCITY_VERSION"in r)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(r.TEAMCITY_VERSION)?1:0;if("truecolor"===r.COLORTERM)return 3;if("TERM_PROGRAM"in r){const e=parseInt((r.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(r.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(r.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(r.TERM)||"COLORTERM"in r?1:i}return n("no-color")||n("no-colors")||n("color=false")||n("color=never")?u=0:(n("color")||n("colors")||n("color=true")||n("color=always"))&&(u=1),"FORCE_COLOR"in r&&(u="true"===r.FORCE_COLOR?1:"false"===r.FORCE_COLOR?0:0===r.FORCE_COLOR.length?1:Math.min(parseInt(r.FORCE_COLOR,10),3)),jr={supportsColor:function(e){return o(i(e,e&&e.isTTY))},stdout:o(i(!0,t.isatty(1))),stderr:o(i(!0,t.isatty(2)))}}();e&&(e.stderr||e).level>=2&&(t.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch(e){}t.inspectOpts=Object.keys(process.env).filter((e=>/^debug_/i.test(e))).reduce(((e,t)=>{const n=t.substring(6).toLowerCase().replace(/_([a-z])/g,((e,t)=>t.toUpperCase()));let r=process.env[t];return r=!!/^(yes|on|true|enabled)$/i.test(r)||!/^(no|off|false|disabled)$/i.test(r)&&("null"===r?null:Number(r)),e[n]=r,e}),{}),e.exports=Rr()(t);const{formatters:u}=e.exports;u.o=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts).split("\n").map((e=>e.trim())).join(" ")},u.O=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts)}}(Gr,Gr.exports)),Gr.exports}Jr=Nr,"undefined"==typeof process||"renderer"===process.type||!0===process.browser||process.__nwjs?Jr.exports=(Br||(Br=1,function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,u=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(u=r))})),t.splice(u,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=Rr()(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(Ir,Ir.exports)),Ir.exports):Jr.exports=Ur();var Wr=function(e){return(e=e||{}).circles?function(e){var t=[],n=[];return e.proto?function e(u){if("object"!=typeof u||null===u)return u;if(u instanceof Date)return new Date(u);if(Array.isArray(u))return r(u,e);if(u instanceof Map)return new Map(r(Array.from(u),e));if(u instanceof Set)return new Set(r(Array.from(u),e));var o={};for(var i in t.push(u),n.push(o),u){var s=u[i];if("object"!=typeof s||null===s)o[i]=s;else if(s instanceof Date)o[i]=new Date(s);else if(s instanceof Map)o[i]=new Map(r(Array.from(s),e));else if(s instanceof Set)o[i]=new Set(r(Array.from(s),e));else if(ArrayBuffer.isView(s))o[i]=zr(s);else{var c=t.indexOf(s);o[i]=-1!==c?n[c]:e(s)}}return t.pop(),n.pop(),o}:function e(u){if("object"!=typeof u||null===u)return u;if(u instanceof Date)return new Date(u);if(Array.isArray(u))return r(u,e);if(u instanceof Map)return new Map(r(Array.from(u),e));if(u instanceof Set)return new Set(r(Array.from(u),e));var o={};for(var i in t.push(u),n.push(o),u)if(!1!==Object.hasOwnProperty.call(u,i)){var s=u[i];if("object"!=typeof s||null===s)o[i]=s;else if(s instanceof Date)o[i]=new Date(s);else if(s instanceof Map)o[i]=new Map(r(Array.from(s),e));else if(s instanceof Set)o[i]=new Set(r(Array.from(s),e));else if(ArrayBuffer.isView(s))o[i]=zr(s);else{var c=t.indexOf(s);o[i]=-1!==c?n[c]:e(s)}}return t.pop(),n.pop(),o};function r(e,r){for(var u=Object.keys(e),o=new Array(u.length),i=0;i!e,Qr=e=>e&&"object"==typeof e&&!Array.isArray(e),eu=(e,t,n)=>{(Array.isArray(t)?t:[t]).forEach((t=>{if(t)throw new Error(`Problem with log4js configuration: (${Kr.inspect(e,{depth:5})}) - ${n}`)}))};var tu={configure:e=>{qr("New configuration to be validated: ",e),eu(e,Zr(Qr(e)),"must be an object."),qr(`Calling pre-processing listeners (${Yr.length})`),Yr.forEach((t=>t(e))),qr("Configuration pre-processing finished."),qr(`Calling configuration listeners (${Xr.length})`),Xr.forEach((t=>t(e))),qr("Configuration finished.")},addListener:e=>{Xr.push(e),qr(`Added listener, now ${Xr.length} listeners`)},addPreProcessingListener:e=>{Yr.push(e),qr(`Added pre-processing listener, now ${Yr.length} listeners`)},throwExceptionIf:eu,anObject:Qr,anInteger:e=>e&&"number"==typeof e&&Number.isInteger(e),validIdentifier:e=>/^[A-Za-z][A-Za-z0-9_]*$/g.test(e),not:Zr},nu={exports:{}};!function(e){function t(e,t){for(var n=e.toString();n.length-1?s:c,l=n(u.getHours()),f=n(u.getMinutes()),d=n(u.getSeconds()),D=t(u.getMilliseconds(),3),p=function(e){var t=Math.abs(e),n=String(Math.floor(t/60)),r=String(t%60);return n=("0"+n).slice(-2),r=("0"+r).slice(-2),0===e?"Z":(e<0?"+":"-")+n+":"+r}(u.getTimezoneOffset());return r.replace(/dd/g,o).replace(/MM/g,i).replace(/y{1,4}/g,a).replace(/hh/g,l).replace(/mm/g,f).replace(/ss/g,d).replace(/SSS/g,D).replace(/O/g,p)}function u(e,t,n,r){e["set"+(r?"":"UTC")+t](n)}e.exports=r,e.exports.asString=r,e.exports.parse=function(t,n,r){if(!t)throw new Error("pattern must be supplied");return function(t,n,r){var o=t.indexOf("O")<0,i=!1,s=[{pattern:/y{1,4}/,regexp:"\\d{1,4}",fn:function(e,t){u(e,"FullYear",t,o)}},{pattern:/MM/,regexp:"\\d{1,2}",fn:function(e,t){u(e,"Month",t-1,o),e.getMonth()!==t-1&&(i=!0)}},{pattern:/dd/,regexp:"\\d{1,2}",fn:function(e,t){i&&u(e,"Month",e.getMonth()-1,o),u(e,"Date",t,o)}},{pattern:/hh/,regexp:"\\d{1,2}",fn:function(e,t){u(e,"Hours",t,o)}},{pattern:/mm/,regexp:"\\d\\d",fn:function(e,t){u(e,"Minutes",t,o)}},{pattern:/ss/,regexp:"\\d\\d",fn:function(e,t){u(e,"Seconds",t,o)}},{pattern:/SSS/,regexp:"\\d\\d\\d",fn:function(e,t){u(e,"Milliseconds",t,o)}},{pattern:/O/,regexp:"[+-]\\d{1,2}:?\\d{2}?|Z",fn:function(e,t){t="Z"===t?0:t.replace(":","");var n=Math.abs(t),r=(t>0?-1:1)*(n%100+60*Math.floor(n/100));e.setUTCMinutes(e.getUTCMinutes()+r)}}],c=s.reduce((function(e,t){return t.pattern.test(e.regexp)?(t.index=e.regexp.match(t.pattern).index,e.regexp=e.regexp.replace(t.pattern,"("+t.regexp+")")):t.index=-1,e}),{regexp:t,index:[]}),a=s.filter((function(e){return e.index>-1}));a.sort((function(e,t){return e.index-t.index}));var l=new RegExp(c.regexp).exec(n);if(l){var f=r||e.exports.now();return a.forEach((function(e,t){e.fn(f,l[t+1])})),f}throw new Error("String '"+n+"' could not be parsed as '"+t+"'")}(t,n,r)},e.exports.now=function(){return new Date},e.exports.ISO8601_FORMAT="yyyy-MM-ddThh:mm:ss.SSS",e.exports.ISO8601_WITH_TZ_OFFSET_FORMAT="yyyy-MM-ddThh:mm:ss.SSSO",e.exports.DATETIME_FORMAT="dd MM yyyy hh:mm:ss.SSS",e.exports.ABSOLUTETIME_FORMAT="hh:mm:ss.SSS"}(nu);const ru=nu.exports,uu=E.default,ou=F.default,iu=p.default,su={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[90,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[91,39],yellow:[33,39]};function cu(e){return e?`[${su[e][0]}m`:""}function au(e){return e?`[${su[e][1]}m`:""}function lu(e,t){return n=ou.format("[%s] [%s] %s - ",ru.asString(e.startTime),e.level.toString(),e.categoryName),cu(r=t)+n+au(r);var n,r}function fu(e){return lu(e)+ou.format(...e.data)}function du(e){return lu(e,e.level.colour)+ou.format(...e.data)}function Du(e){return ou.format(...e.data)}function pu(e){return e.data[0]}function Eu(e,t){const n=/%(-?[0-9]+)?(\.?-?[0-9]+)?([[\]cdhmnprzxXyflos%])(\{([^}]+)\})?|([^%]+)/;function r(e){return e&&e.pid?e.pid.toString():process.pid.toString()}e=e||"%r %p %c - %m%n";const u={c:function(e,t){let n=e.categoryName;if(t){const e=parseInt(t,10),r=n.split(".");ee&&(n=r.slice(-e).join(iu.sep))}return n},l:function(e){return e.lineNumber?`${e.lineNumber}`:""},o:function(e){return e.columnNumber?`${e.columnNumber}`:""},s:function(e){return e.callStack||""}};function o(e,t,n){return u[e](t,n)}function i(e,t,n){let r=e;return r=function(e,t){let n;return e?(n=parseInt(e.substr(1),10),n>0?t.slice(0,n):t.slice(n)):t}(t,r),r=function(e,t){let n;if(e)if("-"===e.charAt(0))for(n=parseInt(e.substr(1),10);t.lengthDu,basic:()=>fu,colored:()=>du,coloured:()=>du,pattern:e=>Eu(e&&e.pattern,e&&e.tokens),dummy:()=>pu};var hu={basicLayout:fu,messagePassThroughLayout:Du,patternLayout:Eu,colouredLayout:du,coloredLayout:du,dummyLayout:pu,addLayout(e,t){mu[e]=t},layout:(e,t)=>mu[e]&&mu[e](t)};const yu=tu,Cu=["white","grey","black","blue","cyan","green","magenta","red","yellow"];class Fu{constructor(e,t,n){this.level=e,this.levelStr=t,this.colour=n}toString(){return this.levelStr}static getLevel(e,t){return e?e instanceof Fu?e:(e instanceof Object&&e.levelStr&&(e=e.levelStr),Fu[e.toString().toUpperCase()]||t):t}static addLevels(e){if(e){Object.keys(e).forEach((t=>{const n=t.toUpperCase();Fu[n]=new Fu(e[t].value,n,e[t].colour);const r=Fu.levels.findIndex((e=>e.levelStr===n));r>-1?Fu.levels[r]=Fu[n]:Fu.levels.push(Fu[n])})),Fu.levels.sort(((e,t)=>e.level-t.level))}}isLessThanOrEqualTo(e){return"string"==typeof e&&(e=Fu.getLevel(e)),this.level<=e.level}isGreaterThanOrEqualTo(e){return"string"==typeof e&&(e=Fu.getLevel(e)),this.level>=e.level}isEqualTo(e){return"string"==typeof e&&(e=Fu.getLevel(e)),this.level===e.level}}Fu.levels=[],Fu.addLevels({ALL:{value:Number.MIN_VALUE,colour:"grey"},TRACE:{value:5e3,colour:"blue"},DEBUG:{value:1e4,colour:"cyan"},INFO:{value:2e4,colour:"green"},WARN:{value:3e4,colour:"yellow"},ERROR:{value:4e4,colour:"red"},FATAL:{value:5e4,colour:"magenta"},MARK:{value:9007199254740992,colour:"grey"},OFF:{value:Number.MAX_VALUE,colour:"grey"}}),yu.addListener((e=>{const t=e.levels;if(t){yu.throwExceptionIf(e,yu.not(yu.anObject(t)),"levels must be an object");Object.keys(t).forEach((n=>{yu.throwExceptionIf(e,yu.not(yu.validIdentifier(n)),`level name "${n}" is not a valid identifier (must start with a letter, only contain A-Z,a-z,0-9,_)`),yu.throwExceptionIf(e,yu.not(yu.anObject(t[n])),`level "${n}" must be an object`),yu.throwExceptionIf(e,yu.not(t[n].value),`level "${n}" must have a 'value' property`),yu.throwExceptionIf(e,yu.not(yu.anInteger(t[n].value)),`level "${n}".value must have an integer value`),yu.throwExceptionIf(e,yu.not(t[n].colour),`level "${n}" must have a 'colour' property`),yu.throwExceptionIf(e,yu.not(Cu.indexOf(t[n].colour)>-1),`level "${n}".colour must be one of ${Cu.join(", ")}`)}))}})),yu.addListener((e=>{Fu.addLevels(e.levels)}));var gu=Fu,Au={exports:{}},vu={};/*! (c) 2020 Andrea Giammarchi */
+const{parse:Su,stringify:wu}=JSON,{keys:Ou}=Object,bu=String,_u="string",Bu={},Pu="object",ku=(e,t)=>t,xu=e=>e instanceof bu?bu(e):e,Nu=(e,t)=>typeof t===_u?new bu(t):t,Iu=(e,t,n,r)=>{const u=[];for(let o=Ou(n),{length:i}=o,s=0;s{const r=bu(t.push(n)-1);return e.set(n,r),r},Ru=(e,t)=>{const n=Su(e,Nu).map(xu),r=n[0],u=t||ku,o=typeof r===Pu&&r?Iu(n,new Set,r,u):r;return u.call({"":o},"",o)};vu.parse=Ru;const Mu=(e,t,n)=>{const r=t&&typeof t===Pu?(e,n)=>""===e||-1Su(Mu(e));vu.fromJSON=e=>Ru(wu(e));const Lu=vu,ju=gu;class $u{constructor(e,t,n,r,u){this.startTime=new Date,this.categoryName=e,this.data=n,this.level=t,this.context=Object.assign({},r),this.pid=process.pid,u&&(this.functionName=u.functionName,this.fileName=u.fileName,this.lineNumber=u.lineNumber,this.columnNumber=u.columnNumber,this.callStack=u.callStack)}serialise(){const e=this.data.map((e=>(e&&e.message&&e.stack&&(e=Object.assign({message:e.message,stack:e.stack},e)),e)));return this.data=e,Lu.stringify(this)}static deserialise(e){let t;try{const n=Lu.parse(e);n.data=n.data.map((e=>{if(e&&e.message&&e.stack){const t=new Error(e);Object.keys(e).forEach((n=>{t[n]=e[n]})),e=t}return e})),t=new $u(n.categoryName,ju.getLevel(n.level.levelStr),n.data,n.context),t.startTime=new Date(n.startTime),t.pid=n.pid,t.cluster=n.cluster}catch(n){t=new $u("log4js",ju.ERROR,["Unable to parse log:",e,"because: ",n])}return t}}var Hu=$u;const Ju=Nr.exports("log4js:clustering"),Gu=Hu,Vu=tu;let Uu=!1,Wu=null;try{Wu=require("cluster")}catch(e){Ju("cluster module not present"),Uu=!0}const zu=[];let Ku=!1,qu="NODE_APP_INSTANCE";const Yu=()=>Ku&&"0"===process.env[qu],Xu=()=>Uu||Wu.isMaster||Yu(),Zu=e=>{zu.forEach((t=>t(e)))},Qu=(e,t)=>{if(Ju("cluster message received from worker ",e,": ",t),e.topic&&e.data&&(t=e,e=void 0),t&&t.topic&&"log4js:message"===t.topic){Ju("received message: ",t.data);const e=Gu.deserialise(t.data);Zu(e)}};Uu||Vu.addListener((e=>{zu.length=0,({pm2:Ku,disableClustering:Uu,pm2InstanceVar:qu="NODE_APP_INSTANCE"}=e),Ju(`clustering disabled ? ${Uu}`),Ju(`cluster.isMaster ? ${Wu&&Wu.isMaster}`),Ju(`pm2 enabled ? ${Ku}`),Ju(`pm2InstanceVar = ${qu}`),Ju(`process.env[${qu}] = ${process.env[qu]}`),Ku&&process.removeListener("message",Qu),Wu&&Wu.removeListener&&Wu.removeListener("message",Qu),Uu||e.disableClustering?Ju("Not listening for cluster messages, because clustering disabled."):Yu()?(Ju("listening for PM2 broadcast messages"),process.on("message",Qu)):Wu.isMaster?(Ju("listening for cluster messages"),Wu.on("message",Qu)):Ju("not listening for messages, because we are not a master process")}));var eo={onlyOnMaster:(e,t)=>Xu()?e():t,isMaster:Xu,send:e=>{Xu()?Zu(e):(Ku||(e.cluster={workerId:Wu.worker.id,worker:process.pid}),process.send({topic:"log4js:message",data:e.serialise()}))},onMessage:e=>{zu.push(e)}},to={};function no(e){if("number"==typeof e&&Number.isInteger(e))return e;const t={K:1024,M:1048576,G:1073741824},n=Object.keys(t),r=e.substr(e.length-1).toLocaleUpperCase(),u=e.substring(0,e.length-1).trim();if(n.indexOf(r)<0||!Number.isInteger(Number(u)))throw Error(`maxLogSize: "${e}" is invalid`);return u*t[r]}function ro(e){return function(e,t){const n=Object.assign({},t);return Object.keys(e).forEach((r=>{n[r]&&(n[r]=e[r](t[r]))})),n}({maxLogSize:no},e)}const uo={file:ro,fileSync:ro};to.modifyConfig=e=>uo[e.type]?uo[e.type](e):e;var oo={};const io=console.log.bind(console);oo.configure=function(e,t){let n=t.colouredLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){return n=>{io(e(n,t))}}(n,e.timezoneOffset)};var so={};so.configure=function(e,t){let n=t.colouredLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){return n=>{process.stdout.write(`${e(n,t)}\n`)}}(n,e.timezoneOffset)};var co={};co.configure=function(e,t){let n=t.colouredLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){return n=>{process.stderr.write(`${e(n,t)}\n`)}}(n,e.timezoneOffset)};var ao={};ao.configure=function(e,t,n,r){const u=n(e.appender);return function(e,t,n,r){const u=r.getLevel(e),o=r.getLevel(t,r.FATAL);return e=>{const t=e.level;t.isGreaterThanOrEqualTo(u)&&t.isLessThanOrEqualTo(o)&&n(e)}}(e.level,e.maxLevel,u,r)};var lo={};const fo=Nr.exports("log4js:categoryFilter");lo.configure=function(e,t,n){const r=n(e.appender);return function(e,t){return"string"==typeof e&&(e=[e]),n=>{fo(`Checking ${n.categoryName} against ${e}`),-1===e.indexOf(n.categoryName)&&(fo("Not excluded, sending to appender"),t(n))}}(e.exclude,r)};var Do={};const po=Nr.exports("log4js:noLogFilter");Do.configure=function(e,t,n){const r=n(e.appender);return function(e,t){return n=>{po(`Checking data: ${n.data} against filters: ${e}`),"string"==typeof e&&(e=[e]),e=e.filter((e=>null!=e&&""!==e));const r=new RegExp(e.join("|"),"i");(0===e.length||n.data.findIndex((e=>r.test(e)))<0)&&(po("Not excluded, sending to appender"),t(n))}}(e.exclude,r)};var Eo={},mo={exports:{}},ho={},yo={fromCallback:function(e){return Object.defineProperty((function(){if("function"!=typeof arguments[arguments.length-1])return new Promise(((t,n)=>{arguments[arguments.length]=(e,r)=>{if(e)return n(e);t(r)},arguments.length++,e.apply(this,arguments)}));e.apply(this,arguments)}),"name",{value:e.name})},fromPromise:function(e){return Object.defineProperty((function(){const t=arguments[arguments.length-1];if("function"!=typeof t)return e.apply(this,arguments);e.apply(this,arguments).then((e=>t(null,e)),t)}),"name",{value:e.name})}};!function(e){const t=yo.fromCallback,n=we,r=["access","appendFile","chmod","chown","close","copyFile","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchown","lchmod","link","lstat","mkdir","mkdtemp","open","readFile","readdir","readlink","realpath","rename","rmdir","stat","symlink","truncate","unlink","utimes","writeFile"].filter((e=>"function"==typeof n[e]));Object.keys(n).forEach((t=>{"promises"!==t&&(e[t]=n[t])})),r.forEach((r=>{e[r]=t(n[r])})),e.exists=function(e,t){return"function"==typeof t?n.exists(e,t):new Promise((t=>n.exists(e,t)))},e.read=function(e,t,r,u,o,i){return"function"==typeof i?n.read(e,t,r,u,o,i):new Promise(((i,s)=>{n.read(e,t,r,u,o,((e,t,n)=>{if(e)return s(e);i({bytesRead:t,buffer:n})}))}))},e.write=function(e,t,...r){return"function"==typeof r[r.length-1]?n.write(e,t,...r):new Promise(((u,o)=>{n.write(e,t,...r,((e,t,n)=>{if(e)return o(e);u({bytesWritten:t,buffer:n})}))}))},"function"==typeof n.realpath.native&&(e.realpath.native=t(n.realpath.native))}(ho);const Co=p.default;function Fo(e){return(e=Co.normalize(Co.resolve(e)).split(Co.sep)).length>0?e[0]:null}const go=/[<>:"|?*]/;var Ao=function(e){const t=Fo(e);return e=e.replace(t,""),go.test(e)};const vo=we,So=p.default,wo=Ao,Oo=parseInt("0777",8);var bo=function e(t,n,r,u){if("function"==typeof n?(r=n,n={}):n&&"object"==typeof n||(n={mode:n}),"win32"===process.platform&&wo(t)){const e=new Error(t+" contains invalid WIN32 path characters.");return e.code="EINVAL",r(e)}let o=n.mode;const i=n.fs||vo;void 0===o&&(o=Oo&~process.umask()),u||(u=null),r=r||function(){},t=So.resolve(t),i.mkdir(t,o,(o=>{if(!o)return r(null,u=u||t);if("ENOENT"===o.code){if(So.dirname(t)===t)return r(o);e(So.dirname(t),n,((u,o)=>{u?r(u,o):e(t,n,r,o)}))}else i.stat(t,((e,t)=>{e||!t.isDirectory()?r(o,u):r(null,u)}))}))};const _o=we,Bo=p.default,Po=Ao,ko=parseInt("0777",8);var xo=function e(t,n,r){n&&"object"==typeof n||(n={mode:n});let u=n.mode;const o=n.fs||_o;if("win32"===process.platform&&Po(t)){const e=new Error(t+" contains invalid WIN32 path characters.");throw e.code="EINVAL",e}void 0===u&&(u=ko&~process.umask()),r||(r=null),t=Bo.resolve(t);try{o.mkdirSync(t,u),r=r||t}catch(u){if("ENOENT"===u.code){if(Bo.dirname(t)===t)throw u;r=e(Bo.dirname(t),n,r),e(t,n,r)}else{let e;try{e=o.statSync(t)}catch(e){throw u}if(!e.isDirectory())throw u}}return r};const No=(0,yo.fromCallback)(bo);var Io={mkdirs:No,mkdirsSync:xo,mkdirp:No,mkdirpSync:xo,ensureDir:No,ensureDirSync:xo};const To=we;E.default,p.default;var Ro=function(e,t,n,r){To.open(e,"r+",((e,u)=>{if(e)return r(e);To.futimes(u,t,n,(e=>{To.close(u,(t=>{r&&r(e||t)}))}))}))},Mo=function(e,t,n){const r=To.openSync(e,"r+");return To.futimesSync(r,t,n),To.closeSync(r)};const Lo=we,jo=p.default,$o=10,Ho=5,Jo=0,Go=process.versions.node.split("."),Vo=Number.parseInt(Go[0],10),Uo=Number.parseInt(Go[1],10),Wo=Number.parseInt(Go[2],10);function zo(){if(Vo>$o)return!0;if(Vo===$o){if(Uo>Ho)return!0;if(Uo===Ho&&Wo>=Jo)return!0}return!1}function Ko(e,t){const n=jo.resolve(e).split(jo.sep).filter((e=>e)),r=jo.resolve(t).split(jo.sep).filter((e=>e));return n.reduce(((e,t,n)=>e&&r[n]===t),!0)}function qo(e,t,n){return`Cannot ${n} '${e}' to a subdirectory of itself, '${t}'.`}var Yo,Xo,Zo={checkPaths:function(e,t,n,r){!function(e,t,n){zo()?Lo.stat(e,{bigint:!0},((e,r)=>{if(e)return n(e);Lo.stat(t,{bigint:!0},((e,t)=>e?"ENOENT"===e.code?n(null,{srcStat:r,destStat:null}):n(e):n(null,{srcStat:r,destStat:t})))})):Lo.stat(e,((e,r)=>{if(e)return n(e);Lo.stat(t,((e,t)=>e?"ENOENT"===e.code?n(null,{srcStat:r,destStat:null}):n(e):n(null,{srcStat:r,destStat:t})))}))}(e,t,((u,o)=>{if(u)return r(u);const{srcStat:i,destStat:s}=o;return s&&s.ino&&s.dev&&s.ino===i.ino&&s.dev===i.dev?r(new Error("Source and destination must not be the same.")):i.isDirectory()&&Ko(e,t)?r(new Error(qo(e,t,n))):r(null,{srcStat:i,destStat:s})}))},checkPathsSync:function(e,t,n){const{srcStat:r,destStat:u}=function(e,t){let n,r;n=zo()?Lo.statSync(e,{bigint:!0}):Lo.statSync(e);try{r=zo()?Lo.statSync(t,{bigint:!0}):Lo.statSync(t)}catch(e){if("ENOENT"===e.code)return{srcStat:n,destStat:null};throw e}return{srcStat:n,destStat:r}}(e,t);if(u&&u.ino&&u.dev&&u.ino===r.ino&&u.dev===r.dev)throw new Error("Source and destination must not be the same.");if(r.isDirectory()&&Ko(e,t))throw new Error(qo(e,t,n));return{srcStat:r,destStat:u}},checkParentPaths:function e(t,n,r,u,o){const i=jo.resolve(jo.dirname(t)),s=jo.resolve(jo.dirname(r));if(s===i||s===jo.parse(s).root)return o();zo()?Lo.stat(s,{bigint:!0},((i,c)=>i?"ENOENT"===i.code?o():o(i):c.ino&&c.dev&&c.ino===n.ino&&c.dev===n.dev?o(new Error(qo(t,r,u))):e(t,n,s,u,o))):Lo.stat(s,((i,c)=>i?"ENOENT"===i.code?o():o(i):c.ino&&c.dev&&c.ino===n.ino&&c.dev===n.dev?o(new Error(qo(t,r,u))):e(t,n,s,u,o)))},checkParentPathsSync:function e(t,n,r,u){const o=jo.resolve(jo.dirname(t)),i=jo.resolve(jo.dirname(r));if(i===o||i===jo.parse(i).root)return;let s;try{s=zo()?Lo.statSync(i,{bigint:!0}):Lo.statSync(i)}catch(e){if("ENOENT"===e.code)return;throw e}if(s.ino&&s.dev&&s.ino===n.ino&&s.dev===n.dev)throw new Error(qo(t,r,u));return e(t,n,i,u)},isSrcSubdir:Ko};const Qo=we,ei=p.default,ti=Io.mkdirsSync,ni=Mo,ri=Zo;function ui(e,t,n,r){if(!r.filter||r.filter(t,n))return function(e,t,n,r){const u=r.dereference?Qo.statSync:Qo.lstatSync,o=u(t);if(o.isDirectory())return function(e,t,n,r,u){if(!t)return function(e,t,n,r){return Qo.mkdirSync(n),ii(t,n,r),Qo.chmodSync(n,e.mode)}(e,n,r,u);if(t&&!t.isDirectory())throw new Error(`Cannot overwrite non-directory '${r}' with directory '${n}'.`);return ii(n,r,u)}(o,e,t,n,r);if(o.isFile()||o.isCharacterDevice()||o.isBlockDevice())return function(e,t,n,r,u){return t?function(e,t,n,r){if(r.overwrite)return Qo.unlinkSync(n),oi(e,t,n,r);if(r.errorOnExist)throw new Error(`'${n}' already exists`)}(e,n,r,u):oi(e,n,r,u)}(o,e,t,n,r);if(o.isSymbolicLink())return function(e,t,n,r){let u=Qo.readlinkSync(t);r.dereference&&(u=ei.resolve(process.cwd(),u));if(e){let e;try{e=Qo.readlinkSync(n)}catch(e){if("EINVAL"===e.code||"UNKNOWN"===e.code)return Qo.symlinkSync(u,n);throw e}if(r.dereference&&(e=ei.resolve(process.cwd(),e)),ri.isSrcSubdir(u,e))throw new Error(`Cannot copy '${u}' to a subdirectory of itself, '${e}'.`);if(Qo.statSync(n).isDirectory()&&ri.isSrcSubdir(e,u))throw new Error(`Cannot overwrite '${e}' with '${u}'.`);return function(e,t){return Qo.unlinkSync(t),Qo.symlinkSync(e,t)}(u,n)}return Qo.symlinkSync(u,n)}(e,t,n,r)}(e,t,n,r)}function oi(e,t,n,r){return"function"==typeof Qo.copyFileSync?(Qo.copyFileSync(t,n),Qo.chmodSync(n,e.mode),r.preserveTimestamps?ni(n,e.atime,e.mtime):void 0):function(e,t,n,r){const u=65536,o=(Xo?Yo:(Xo=1,Yo=function(e){if("function"==typeof Buffer.allocUnsafe)try{return Buffer.allocUnsafe(e)}catch(t){return new Buffer(e)}return new Buffer(e)}))(u),i=Qo.openSync(t,"r"),s=Qo.openSync(n,"w",e.mode);let c=0;for(;cfunction(e,t,n,r){const u=ei.join(t,e),o=ei.join(n,e),{destStat:i}=ri.checkPathsSync(u,o,"copy");return ui(i,u,o,r)}(r,e,t,n)))}var si=function(e,t,n){"function"==typeof n&&(n={filter:n}),(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269");const{srcStat:r,destStat:u}=ri.checkPathsSync(e,t,"copy");return ri.checkParentPathsSync(e,r,t,"copy"),function(e,t,n,r){if(r.filter&&!r.filter(t,n))return;const u=ei.dirname(n);Qo.existsSync(u)||ti(u);return ui(e,t,n,r)}(u,e,t,n)},ci={copySync:si};const ai=yo.fromPromise,li=ho;var fi={pathExists:ai((function(e){return li.access(e).then((()=>!0)).catch((()=>!1))})),pathExistsSync:li.existsSync};const di=we,Di=p.default,pi=Io.mkdirs,Ei=fi.pathExists,mi=Ro,hi=Zo;function yi(e,t,n,r,u){const o=Di.dirname(n);Ei(o,((i,s)=>i?u(i):s?Fi(e,t,n,r,u):void pi(o,(o=>o?u(o):Fi(e,t,n,r,u)))))}function Ci(e,t,n,r,u,o){Promise.resolve(u.filter(n,r)).then((i=>i?e(t,n,r,u,o):o()),(e=>o(e)))}function Fi(e,t,n,r,u){return r.filter?Ci(gi,e,t,n,r,u):gi(e,t,n,r,u)}function gi(e,t,n,r,u){(r.dereference?di.stat:di.lstat)(t,((o,i)=>o?u(o):i.isDirectory()?function(e,t,n,r,u,o){if(!t)return function(e,t,n,r,u){di.mkdir(n,(o=>{if(o)return u(o);Si(t,n,r,(t=>t?u(t):di.chmod(n,e.mode,u)))}))}(e,n,r,u,o);if(t&&!t.isDirectory())return o(new Error(`Cannot overwrite non-directory '${r}' with directory '${n}'.`));return Si(n,r,u,o)}(i,e,t,n,r,u):i.isFile()||i.isCharacterDevice()||i.isBlockDevice()?function(e,t,n,r,u,o){return t?function(e,t,n,r,u){if(!r.overwrite)return r.errorOnExist?u(new Error(`'${n}' already exists`)):u();di.unlink(n,(o=>o?u(o):Ai(e,t,n,r,u)))}(e,n,r,u,o):Ai(e,n,r,u,o)}(i,e,t,n,r,u):i.isSymbolicLink()?function(e,t,n,r,u){di.readlink(t,((t,o)=>t?u(t):(r.dereference&&(o=Di.resolve(process.cwd(),o)),e?void di.readlink(n,((t,i)=>t?"EINVAL"===t.code||"UNKNOWN"===t.code?di.symlink(o,n,u):u(t):(r.dereference&&(i=Di.resolve(process.cwd(),i)),hi.isSrcSubdir(o,i)?u(new Error(`Cannot copy '${o}' to a subdirectory of itself, '${i}'.`)):e.isDirectory()&&hi.isSrcSubdir(i,o)?u(new Error(`Cannot overwrite '${i}' with '${o}'.`)):function(e,t,n){di.unlink(t,(r=>r?n(r):di.symlink(e,t,n)))}(o,n,u)))):di.symlink(o,n,u))))}(e,t,n,r,u):void 0))}function Ai(e,t,n,r,u){return"function"==typeof di.copyFile?di.copyFile(t,n,(t=>t?u(t):vi(e,n,r,u))):function(e,t,n,r,u){const o=di.createReadStream(t);o.on("error",(e=>u(e))).once("open",(()=>{const t=di.createWriteStream(n,{mode:e.mode});t.on("error",(e=>u(e))).on("open",(()=>o.pipe(t))).once("close",(()=>vi(e,n,r,u)))}))}(e,t,n,r,u)}function vi(e,t,n,r){di.chmod(t,e.mode,(u=>u?r(u):n.preserveTimestamps?mi(t,e.atime,e.mtime,r):r()))}function Si(e,t,n,r){di.readdir(e,((u,o)=>u?r(u):wi(o,e,t,n,r)))}function wi(e,t,n,r,u){const o=e.pop();return o?function(e,t,n,r,u,o){const i=Di.join(n,t),s=Di.join(r,t);hi.checkPaths(i,s,"copy",((t,c)=>{if(t)return o(t);const{destStat:a}=c;Fi(a,i,s,u,(t=>t?o(t):wi(e,n,r,u,o)))}))}(e,o,t,n,r,u):u()}var Oi=function(e,t,n,r){"function"!=typeof n||r?"function"==typeof n&&(n={filter:n}):(r=n,n={}),r=r||function(){},(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269"),hi.checkPaths(e,t,"copy",((u,o)=>{if(u)return r(u);const{srcStat:i,destStat:s}=o;hi.checkParentPaths(e,i,t,"copy",(u=>u?r(u):n.filter?Ci(yi,s,e,t,n,r):yi(s,e,t,n,r)))}))};var bi={copy:(0,yo.fromCallback)(Oi)};const _i=we,Bi=p.default,Pi=g.default,ki="win32"===process.platform;function xi(e){["unlink","chmod","stat","lstat","rmdir","readdir"].forEach((t=>{e[t]=e[t]||_i[t],e[t+="Sync"]=e[t]||_i[t]})),e.maxBusyTries=e.maxBusyTries||3}function Ni(e,t,n){let r=0;"function"==typeof t&&(n=t,t={}),Pi(e,"rimraf: missing path"),Pi.strictEqual(typeof e,"string","rimraf: path should be a string"),Pi.strictEqual(typeof n,"function","rimraf: callback function required"),Pi(t,"rimraf: invalid options argument provided"),Pi.strictEqual(typeof t,"object","rimraf: options should be object"),xi(t),Ii(e,t,(function u(o){if(o){if(("EBUSY"===o.code||"ENOTEMPTY"===o.code||"EPERM"===o.code)&&rIi(e,t,u)),100*r)}"ENOENT"===o.code&&(o=null)}n(o)}))}function Ii(e,t,n){Pi(e),Pi(t),Pi("function"==typeof n),t.lstat(e,((r,u)=>r&&"ENOENT"===r.code?n(null):r&&"EPERM"===r.code&&ki?Ti(e,t,r,n):u&&u.isDirectory()?Mi(e,t,r,n):void t.unlink(e,(r=>{if(r){if("ENOENT"===r.code)return n(null);if("EPERM"===r.code)return ki?Ti(e,t,r,n):Mi(e,t,r,n);if("EISDIR"===r.code)return Mi(e,t,r,n)}return n(r)}))))}function Ti(e,t,n,r){Pi(e),Pi(t),Pi("function"==typeof r),n&&Pi(n instanceof Error),t.chmod(e,438,(u=>{u?r("ENOENT"===u.code?null:n):t.stat(e,((u,o)=>{u?r("ENOENT"===u.code?null:n):o.isDirectory()?Mi(e,t,n,r):t.unlink(e,r)}))}))}function Ri(e,t,n){let r;Pi(e),Pi(t),n&&Pi(n instanceof Error);try{t.chmodSync(e,438)}catch(e){if("ENOENT"===e.code)return;throw n}try{r=t.statSync(e)}catch(e){if("ENOENT"===e.code)return;throw n}r.isDirectory()?ji(e,t,n):t.unlinkSync(e)}function Mi(e,t,n,r){Pi(e),Pi(t),n&&Pi(n instanceof Error),Pi("function"==typeof r),t.rmdir(e,(u=>{!u||"ENOTEMPTY"!==u.code&&"EEXIST"!==u.code&&"EPERM"!==u.code?u&&"ENOTDIR"===u.code?r(n):r(u):function(e,t,n){Pi(e),Pi(t),Pi("function"==typeof n),t.readdir(e,((r,u)=>{if(r)return n(r);let o,i=u.length;if(0===i)return t.rmdir(e,n);u.forEach((r=>{Ni(Bi.join(e,r),t,(r=>{if(!o)return r?n(o=r):void(0==--i&&t.rmdir(e,n))}))}))}))}(e,t,r)}))}function Li(e,t){let n;xi(t=t||{}),Pi(e,"rimraf: missing path"),Pi.strictEqual(typeof e,"string","rimraf: path should be a string"),Pi(t,"rimraf: missing options"),Pi.strictEqual(typeof t,"object","rimraf: options should be object");try{n=t.lstatSync(e)}catch(n){if("ENOENT"===n.code)return;"EPERM"===n.code&&ki&&Ri(e,t,n)}try{n&&n.isDirectory()?ji(e,t,null):t.unlinkSync(e)}catch(n){if("ENOENT"===n.code)return;if("EPERM"===n.code)return ki?Ri(e,t,n):ji(e,t,n);if("EISDIR"!==n.code)throw n;ji(e,t,n)}}function ji(e,t,n){Pi(e),Pi(t),n&&Pi(n instanceof Error);try{t.rmdirSync(e)}catch(r){if("ENOTDIR"===r.code)throw n;if("ENOTEMPTY"===r.code||"EEXIST"===r.code||"EPERM"===r.code)!function(e,t){if(Pi(e),Pi(t),t.readdirSync(e).forEach((n=>Li(Bi.join(e,n),t))),!ki){return t.rmdirSync(e,t)}{const n=Date.now();do{try{return t.rmdirSync(e,t)}catch(e){}}while(Date.now()-n<500)}}(e,t);else if("ENOENT"!==r.code)throw r}}var $i=Ni;Ni.sync=Li;const Hi=$i;var Ji={remove:(0,yo.fromCallback)(Hi),removeSync:Hi.sync};const Gi=yo.fromCallback,Vi=we,Ui=p.default,Wi=Io,zi=Ji,Ki=Gi((function(e,t){t=t||function(){},Vi.readdir(e,((n,r)=>{if(n)return Wi.mkdirs(e,t);r=r.map((t=>Ui.join(e,t))),function e(){const n=r.pop();if(!n)return t();zi.remove(n,(n=>{if(n)return t(n);e()}))}()}))}));function qi(e){let t;try{t=Vi.readdirSync(e)}catch(t){return Wi.mkdirsSync(e)}t.forEach((t=>{t=Ui.join(e,t),zi.removeSync(t)}))}var Yi={emptyDirSync:qi,emptydirSync:qi,emptyDir:Ki,emptydir:Ki};const Xi=yo.fromCallback,Zi=p.default,Qi=we,es=Io,ts=fi.pathExists;var ns={createFile:Xi((function(e,t){function n(){Qi.writeFile(e,"",(e=>{if(e)return t(e);t()}))}Qi.stat(e,((r,u)=>{if(!r&&u.isFile())return t();const o=Zi.dirname(e);ts(o,((e,r)=>e?t(e):r?n():void es.mkdirs(o,(e=>{if(e)return t(e);n()}))))}))})),createFileSync:function(e){let t;try{t=Qi.statSync(e)}catch(e){}if(t&&t.isFile())return;const n=Zi.dirname(e);Qi.existsSync(n)||es.mkdirsSync(n),Qi.writeFileSync(e,"")}};const rs=yo.fromCallback,us=p.default,os=we,is=Io,ss=fi.pathExists;var cs={createLink:rs((function(e,t,n){function r(e,t){os.link(e,t,(e=>{if(e)return n(e);n(null)}))}ss(t,((u,o)=>u?n(u):o?n(null):void os.lstat(e,(u=>{if(u)return u.message=u.message.replace("lstat","ensureLink"),n(u);const o=us.dirname(t);ss(o,((u,i)=>u?n(u):i?r(e,t):void is.mkdirs(o,(u=>{if(u)return n(u);r(e,t)}))))}))))})),createLinkSync:function(e,t){if(os.existsSync(t))return;try{os.lstatSync(e)}catch(e){throw e.message=e.message.replace("lstat","ensureLink"),e}const n=us.dirname(t);return os.existsSync(n)||is.mkdirsSync(n),os.linkSync(e,t)}};const as=p.default,ls=we,fs=fi.pathExists;var ds={symlinkPaths:function(e,t,n){if(as.isAbsolute(e))return ls.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:e})));{const r=as.dirname(t),u=as.join(r,e);return fs(u,((t,o)=>t?n(t):o?n(null,{toCwd:u,toDst:e}):ls.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:as.relative(r,e)})))))}},symlinkPathsSync:function(e,t){let n;if(as.isAbsolute(e)){if(n=ls.existsSync(e),!n)throw new Error("absolute srcpath does not exist");return{toCwd:e,toDst:e}}{const r=as.dirname(t),u=as.join(r,e);if(n=ls.existsSync(u),n)return{toCwd:u,toDst:e};if(n=ls.existsSync(e),!n)throw new Error("relative srcpath does not exist");return{toCwd:e,toDst:as.relative(r,e)}}}};const Ds=we;var ps={symlinkType:function(e,t,n){if(n="function"==typeof t?t:n,t="function"!=typeof t&&t)return n(null,t);Ds.lstat(e,((e,r)=>{if(e)return n(null,"file");t=r&&r.isDirectory()?"dir":"file",n(null,t)}))},symlinkTypeSync:function(e,t){let n;if(t)return t;try{n=Ds.lstatSync(e)}catch(e){return"file"}return n&&n.isDirectory()?"dir":"file"}};const Es=yo.fromCallback,ms=p.default,hs=we,ys=Io.mkdirs,Cs=Io.mkdirsSync,Fs=ds.symlinkPaths,gs=ds.symlinkPathsSync,As=ps.symlinkType,vs=ps.symlinkTypeSync,Ss=fi.pathExists;var ws={createSymlink:Es((function(e,t,n,r){r="function"==typeof n?n:r,n="function"!=typeof n&&n,Ss(t,((u,o)=>u?r(u):o?r(null):void Fs(e,t,((u,o)=>{if(u)return r(u);e=o.toDst,As(o.toCwd,n,((n,u)=>{if(n)return r(n);const o=ms.dirname(t);Ss(o,((n,i)=>n?r(n):i?hs.symlink(e,t,u,r):void ys(o,(n=>{if(n)return r(n);hs.symlink(e,t,u,r)}))))}))}))))})),createSymlinkSync:function(e,t,n){if(hs.existsSync(t))return;const r=gs(e,t);e=r.toDst,n=vs(r.toCwd,n);const u=ms.dirname(t);return hs.existsSync(u)||Cs(u),hs.symlinkSync(e,t,n)}};var Os,bs={createFile:ns.createFile,createFileSync:ns.createFileSync,ensureFile:ns.createFile,ensureFileSync:ns.createFileSync,createLink:cs.createLink,createLinkSync:cs.createLinkSync,ensureLink:cs.createLink,ensureLinkSync:cs.createLinkSync,createSymlink:ws.createSymlink,createSymlinkSync:ws.createSymlinkSync,ensureSymlink:ws.createSymlink,ensureSymlinkSync:ws.createSymlinkSync};try{Os=we}catch(e){Os=D.default}function _s(e,t){var n,r="\n";return"object"==typeof t&&null!==t&&(t.spaces&&(n=t.spaces),t.EOL&&(r=t.EOL)),JSON.stringify(e,t?t.replacer:null,n).replace(/\n/g,r)+r}function Bs(e){return Buffer.isBuffer(e)&&(e=e.toString("utf8")),e=e.replace(/^\uFEFF/,"")}var Ps={readFile:function(e,t,n){null==n&&(n=t,t={}),"string"==typeof t&&(t={encoding:t});var r=(t=t||{}).fs||Os,u=!0;"throws"in t&&(u=t.throws),r.readFile(e,t,(function(r,o){if(r)return n(r);var i;o=Bs(o);try{i=JSON.parse(o,t?t.reviver:null)}catch(t){return u?(t.message=e+": "+t.message,n(t)):n(null,null)}n(null,i)}))},readFileSync:function(e,t){"string"==typeof(t=t||{})&&(t={encoding:t});var n=t.fs||Os,r=!0;"throws"in t&&(r=t.throws);try{var u=n.readFileSync(e,t);return u=Bs(u),JSON.parse(u,t.reviver)}catch(t){if(r)throw t.message=e+": "+t.message,t;return null}},writeFile:function(e,t,n,r){null==r&&(r=n,n={});var u=(n=n||{}).fs||Os,o="";try{o=_s(t,n)}catch(e){return void(r&&r(e,null))}u.writeFile(e,o,n,r)},writeFileSync:function(e,t,n){var r=(n=n||{}).fs||Os,u=_s(t,n);return r.writeFileSync(e,u,n)}},ks=Ps;const xs=yo.fromCallback,Ns=ks;var Is={readJson:xs(Ns.readFile),readJsonSync:Ns.readFileSync,writeJson:xs(Ns.writeFile),writeJsonSync:Ns.writeFileSync};const Ts=p.default,Rs=Io,Ms=fi.pathExists,Ls=Is;var js=function(e,t,n,r){"function"==typeof n&&(r=n,n={});const u=Ts.dirname(e);Ms(u,((o,i)=>o?r(o):i?Ls.writeJson(e,t,n,r):void Rs.mkdirs(u,(u=>{if(u)return r(u);Ls.writeJson(e,t,n,r)}))))};const $s=we,Hs=p.default,Js=Io,Gs=Is;var Vs=function(e,t,n){const r=Hs.dirname(e);$s.existsSync(r)||Js.mkdirsSync(r),Gs.writeJsonSync(e,t,n)};const Us=yo.fromCallback,Ws=Is;Ws.outputJson=Us(js),Ws.outputJsonSync=Vs,Ws.outputJSON=Ws.outputJson,Ws.outputJSONSync=Ws.outputJsonSync,Ws.writeJSON=Ws.writeJson,Ws.writeJSONSync=Ws.writeJsonSync,Ws.readJSON=Ws.readJson,Ws.readJSONSync=Ws.readJsonSync;var zs=Ws;const Ks=we,qs=p.default,Ys=ci.copySync,Xs=Ji.removeSync,Zs=Io.mkdirpSync,Qs=Zo;function ec(e,t,n){try{Ks.renameSync(e,t)}catch(r){if("EXDEV"!==r.code)throw r;return function(e,t,n){const r={overwrite:n,errorOnExist:!0};return Ys(e,t,r),Xs(e)}(e,t,n)}}var tc=function(e,t,n){const r=(n=n||{}).overwrite||n.clobber||!1,{srcStat:u}=Qs.checkPathsSync(e,t,"move");return Qs.checkParentPathsSync(e,u,t,"move"),Zs(qs.dirname(t)),function(e,t,n){if(n)return Xs(t),ec(e,t,n);if(Ks.existsSync(t))throw new Error("dest already exists.");return ec(e,t,n)}(e,t,r)},nc={moveSync:tc};const rc=we,uc=p.default,oc=bi.copy,ic=Ji.remove,sc=Io.mkdirp,cc=fi.pathExists,ac=Zo;function lc(e,t,n,r){rc.rename(e,t,(u=>u?"EXDEV"!==u.code?r(u):function(e,t,n,r){const u={overwrite:n,errorOnExist:!0};oc(e,t,u,(t=>t?r(t):ic(e,r)))}(e,t,n,r):r()))}var fc=function(e,t,n,r){"function"==typeof n&&(r=n,n={});const u=n.overwrite||n.clobber||!1;ac.checkPaths(e,t,"move",((n,o)=>{if(n)return r(n);const{srcStat:i}=o;ac.checkParentPaths(e,i,t,"move",(n=>{if(n)return r(n);sc(uc.dirname(t),(n=>n?r(n):function(e,t,n,r){if(n)return ic(t,(u=>u?r(u):lc(e,t,n,r)));cc(t,((u,o)=>u?r(u):o?r(new Error("dest already exists.")):lc(e,t,n,r)))}(e,t,u,r)))}))}))};var dc={move:(0,yo.fromCallback)(fc)};const Dc=yo.fromCallback,pc=we,Ec=p.default,mc=Io,hc=fi.pathExists;var yc={outputFile:Dc((function(e,t,n,r){"function"==typeof n&&(r=n,n="utf8");const u=Ec.dirname(e);hc(u,((o,i)=>o?r(o):i?pc.writeFile(e,t,n,r):void mc.mkdirs(u,(u=>{if(u)return r(u);pc.writeFile(e,t,n,r)}))))})),outputFileSync:function(e,...t){const n=Ec.dirname(e);if(pc.existsSync(n))return pc.writeFileSync(e,...t);mc.mkdirsSync(n),pc.writeFileSync(e,...t)}};!function(e){e.exports=Object.assign({},ho,ci,bi,Yi,bs,zs,Io,nc,dc,yc,fi,Ji);const t=D.default;Object.getOwnPropertyDescriptor(t,"promises")&&Object.defineProperty(e.exports,"promises",{get:()=>t.promises})}(mo);const Cc=Nr.exports("streamroller:fileNameFormatter"),Fc=p.default;const gc=Nr.exports("streamroller:fileNameParser"),Ac=nu.exports;const vc=Nr.exports("streamroller:moveAndMaybeCompressFile"),Sc=mo.exports,wc=v.default;var Oc=async(e,t,n)=>{if(n=function(e){const t={mode:parseInt("0600",8),compress:!1},n=Object.assign({},t,e);return vc(`_parseOption: moveAndMaybeCompressFile called with option=${JSON.stringify(n)}`),n}(n),e!==t){if(await Sc.pathExists(e))if(vc(`moveAndMaybeCompressFile: moving file from ${e} to ${t} ${n.compress?"with":"without"} compress`),n.compress)await new Promise(((r,u)=>{let o=!1;const i=Sc.createWriteStream(t,{mode:n.mode,flags:"wx"}).on("open",(()=>{o=!0;const t=Sc.createReadStream(e).on("open",(()=>{t.pipe(wc.createGzip()).pipe(i)})).on("error",(t=>{vc(`moveAndMaybeCompressFile: error reading ${e}`,t),i.destroy(t)}))})).on("finish",(()=>{vc(`moveAndMaybeCompressFile: finished compressing ${t}, deleting ${e}`),Sc.unlink(e).then(r).catch((t=>{vc(`moveAndMaybeCompressFile: error deleting ${e}, truncating instead`,t),Sc.truncate(e).then(r).catch((t=>{vc(`moveAndMaybeCompressFile: error truncating ${e}`,t),u(t)}))}))})).on("error",(e=>{o?(vc(`moveAndMaybeCompressFile: error writing ${t}, deleting`,e),Sc.unlink(t).then((()=>{u(e)})).catch((e=>{vc(`moveAndMaybeCompressFile: error deleting ${t}`,e),u(e)}))):(vc(`moveAndMaybeCompressFile: error creating ${t}`,e),u(e))}))})).catch((()=>{}));else{vc(`moveAndMaybeCompressFile: renaming ${e} to ${t}`);try{await Sc.move(e,t,{overwrite:!0})}catch(n){if(vc(`moveAndMaybeCompressFile: error renaming ${e} to ${t}`,n),"ENOENT"!==n.code){vc("moveAndMaybeCompressFile: trying copy+truncate instead");try{await Sc.copy(e,t,{overwrite:!0}),await Sc.truncate(e)}catch(e){vc("moveAndMaybeCompressFile: error copy+truncate",e)}}}}}else vc("moveAndMaybeCompressFile: source and target are the same, not doing anything")};const bc=Nr.exports("streamroller:RollingFileWriteStream"),_c=mo.exports,Bc=p.default,Pc=E.default,kc=()=>new Date,xc=nu.exports,{Writable:Nc}=C.default,Ic=({file:e,keepFileExt:t,needsIndex:n,alwaysIncludeDate:r,compress:u,fileNameSep:o})=>{let i=o||".";const s=Fc.join(e.dir,e.name),c=t=>t+e.ext,a=(e,t,r)=>!n&&r||!t?e:e+i+t,l=(e,t,n)=>(t>0||r)&&n?e+i+n:e,f=(e,t)=>t&&u?e+".gz":e,d=t?[l,a,c,f]:[c,l,a,f];return({date:e,index:t})=>(Cc(`_formatFileName: date=${e}, index=${t}`),d.reduce(((n,r)=>r(n,t,e)),s))},Tc=({file:e,keepFileExt:t,pattern:n,fileNameSep:r})=>{let u=r||".";const o="__NOT_MATCHING__";let i=[(e,t)=>e.endsWith(".gz")?(gc("it is gzipped"),t.isCompressed=!0,e.slice(0,-1*".gz".length)):e,t?t=>t.startsWith(e.name)&&t.endsWith(e.ext)?(gc("it starts and ends with the right things"),t.slice(e.name.length+1,-1*e.ext.length)):o:t=>t.startsWith(e.base)?(gc("it starts with the right things"),t.slice(e.base.length+1)):o,n?(e,t)=>{const r=e.split(u);let o=r[r.length-1];gc("items: ",r,", indexStr: ",o);let i=e;void 0!==o&&o.match(/^\d+$/)?(i=e.slice(0,-1*(o.length+1)),gc(`dateStr is ${i}`),n&&!i&&(i=o,o="0")):o="0";try{const r=Ac.parse(n,i,new Date(0,0));return Ac.asString(n,r)!==i?e:(t.index=parseInt(o,10),t.date=i,t.timestamp=r.getTime(),"")}catch(t){return gc(`Problem parsing ${i} as ${n}, error was: `,t),e}}:(e,t)=>e.match(/^\d+$/)?(gc("it has an index"),t.index=parseInt(e,10),""):e];return e=>{let t={filename:e,index:0,isCompressed:!1};return i.reduce(((e,n)=>n(e,t)),e)?null:t}},Rc=Oc;var Mc=class extends Nc{constructor(e,t){if(bc(`constructor: creating RollingFileWriteStream. path=${e}`),"string"!=typeof e||0===e.length)throw new Error(`Invalid filename: ${e}`);if(e.endsWith(Bc.sep))throw new Error(`Filename is a directory: ${e}`);0===e.indexOf(`~${Bc.sep}`)&&(e=e.replace("~",Pc.homedir())),super(t),this.options=this._parseOption(t),this.fileObject=Bc.parse(e),""===this.fileObject.dir&&(this.fileObject=Bc.parse(Bc.join(process.cwd(),e))),this.fileFormatter=Ic({file:this.fileObject,alwaysIncludeDate:this.options.alwaysIncludePattern,needsIndex:this.options.maxSize 0`)}else delete n.maxSize;if(n.numBackups||0===n.numBackups){if(n.numBackups<0)throw new Error(`options.numBackups (${n.numBackups}) should be >= 0`);if(n.numBackups>=Number.MAX_SAFE_INTEGER)throw new Error(`options.numBackups (${n.numBackups}) should be < Number.MAX_SAFE_INTEGER`);n.numToKeep=n.numBackups+1}else if(n.numToKeep<=0)throw new Error(`options.numToKeep (${n.numToKeep}) should be > 0`);return bc(`_parseOption: creating stream with option=${JSON.stringify(n)}`),n}_final(e){this.currentFileStream.end("",this.options.encoding,e)}_write(e,t,n){this._shouldRoll().then((()=>{bc(`_write: writing chunk. file=${this.currentFileStream.path} state=${JSON.stringify(this.state)} chunk=${e}`),this.currentFileStream.write(e,t,(t=>{this.state.currentSize+=e.length,n(t)}))}))}async _shouldRoll(){(this._dateChanged()||this._tooBig())&&(bc(`_shouldRoll: rolling because dateChanged? ${this._dateChanged()} or tooBig? ${this._tooBig()}`),await this._roll())}_dateChanged(){return this.state.currentDate&&this.state.currentDate!==xc(this.options.pattern,kc())}_tooBig(){return this.state.currentSize>=this.options.maxSize}_roll(){return bc("_roll: closing the current stream"),new Promise(((e,t)=>{this.currentFileStream.end("",this.options.encoding,(()=>{this._moveOldFiles().then(e).catch(t)}))}))}async _moveOldFiles(){const e=await this._getExistingFiles();for(let t=(this.state.currentDate?e.filter((e=>e.date===this.state.currentDate)):e).length;t>=0;t--){bc(`_moveOldFiles: i = ${t}`);const e=this.fileFormatter({date:this.state.currentDate,index:t}),n=this.fileFormatter({date:this.state.currentDate,index:t+1}),r={compress:this.options.compress&&0===t,mode:this.options.mode};await Rc(e,n,r)}this.state.currentSize=0,this.state.currentDate=this.state.currentDate?xc(this.options.pattern,kc()):null,bc(`_moveOldFiles: finished rolling files. state=${JSON.stringify(this.state)}`),this._renewWriteStream(),await new Promise(((e,t)=>{this.currentFileStream.write("","utf8",(()=>{this._clean().then(e).catch(t)}))}))}async _getExistingFiles(){const e=await _c.readdir(this.fileObject.dir).catch((()=>[]));bc(`_getExistingFiles: files=${e}`);const t=e.map((e=>this.fileNameParser(e))).filter((e=>e)),n=e=>(e.timestamp?e.timestamp:kc().getTime())-e.index;return t.sort(((e,t)=>n(e)-n(t))),t}_renewWriteStream(){const e=this.fileFormatter({date:this.state.currentDate,index:0}),t=e=>{try{return _c.mkdirSync(e,{recursive:!0})}catch(n){if("ENOENT"===n.code)return t(Bc.dirname(e)),t(e);if("EEXIST"!==n.code&&"EROFS"!==n.code)throw n;try{if(_c.statSync(e).isDirectory())return e;throw n}catch(e){throw n}}};t(this.fileObject.dir);const n={flags:this.options.flags,encoding:this.options.encoding,mode:this.options.mode};var r,u;_c.appendFileSync(e,"",(r={...n},u="flags",r["flag"]=r[u],delete r[u],r)),this.currentFileStream=_c.createWriteStream(e,n),this.currentFileStream.on("error",(e=>{this.emit("error",e)}))}async _clean(){const e=await this._getExistingFiles();if(bc(`_clean: numToKeep = ${this.options.numToKeep}, existingFiles = ${e.length}`),bc("_clean: existing files are: ",e),this._tooManyFiles(e.length)){const n=e.slice(0,e.length-this.options.numToKeep).map((e=>Bc.format({dir:this.fileObject.dir,base:e.filename})));await(t=n,bc(`deleteFiles: files to delete: ${t}`),Promise.all(t.map((e=>_c.unlink(e).catch((t=>{bc(`deleteFiles: error when unlinking ${e}, ignoring. Error was ${t}`)}))))))}var t}_tooManyFiles(e){return this.options.numToKeep>0&&e>this.options.numToKeep}};const Lc=Mc;var jc=class extends Lc{constructor(e,t,n,r){r||(r={}),t&&(r.maxSize=t),r.numBackups||0===r.numBackups||(n||0===n||(n=1),r.numBackups=n),super(e,r),this.backups=r.numBackups,this.size=this.options.maxSize}get theStream(){return this.currentFileStream}};const $c=Mc;var Hc={RollingFileWriteStream:Mc,RollingFileStream:jc,DateRollingFileStream:class extends $c{constructor(e,t,n){t&&"object"==typeof t&&(n=t,t=null),n||(n={}),t||(t="yyyy-MM-dd"),n.pattern=t,n.numBackups||0===n.numBackups?n.daysToKeep=n.numBackups:(n.daysToKeep||0===n.daysToKeep?process.emitWarning("options.daysToKeep is deprecated due to the confusion it causes when used together with file size rolling. Please use options.numBackups instead.","DeprecationWarning","streamroller-DEP0001"):n.daysToKeep=1,n.numBackups=n.daysToKeep),super(e,n),this.mode=this.options.mode}get theStream(){return this.currentFileStream}}};const Jc=Nr.exports("log4js:file"),Gc=p.default,Vc=Hc,Uc=E.default.EOL;let Wc=!1;const zc=new Set;function Kc(){zc.forEach((e=>{e.sighupHandler()}))}function qc(e,t,n,r){const u=new Vc.RollingFileStream(e,t,n,r);return u.on("error",(t=>{console.error("log4js.fileAppender - Writing to file %s, error happened ",e,t)})),u.on("drain",(()=>{process.emit("log4js:pause",!1)})),u}Eo.configure=function(e,t){let n=t.basicLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),e.mode=e.mode||384,function(e,t,n,r,u,o){e=Gc.normalize(e),Jc("Creating file appender (",e,", ",n,", ",r=r||0===r?r:5,", ",u,", ",o,")");let i=qc(e,n,r,u);const s=function(e){if(i.writable){if(!0===u.removeColor){const t=/\x1b[[0-9;]*m/g;e.data=e.data.map((e=>"string"==typeof e?e.replace(t,""):e))}i.write(t(e,o)+Uc,"utf8")||process.emit("log4js:pause",!0)}};return s.reopen=function(){i.end((()=>{i=qc(e,n,r,u)}))},s.sighupHandler=function(){Jc("SIGHUP handler called."),s.reopen()},s.shutdown=function(e){zc.delete(s),0===zc.size&&Wc&&(process.removeListener("SIGHUP",Kc),Wc=!1),i.end("","utf-8",e)},zc.add(s),Wc||(process.on("SIGHUP",Kc),Wc=!0),s}(e.filename,n,e.maxLogSize,e.backups,e,e.timezoneOffset)};var Yc={};const Xc=Hc,Zc=E.default.EOL;function Qc(e,t,n,r,u){r.maxSize=r.maxLogSize;const o=function(e,t,n){const r=new Xc.DateRollingFileStream(e,t,n);return r.on("error",(t=>{console.error("log4js.dateFileAppender - Writing to file %s, error happened ",e,t)})),r.on("drain",(()=>{process.emit("log4js:pause",!1)})),r}(e,t,r),i=function(e){o.writable&&(o.write(n(e,u)+Zc,"utf8")||process.emit("log4js:pause",!0))};return i.shutdown=function(e){o.end("","utf-8",e)},i}Yc.configure=function(e,t){let n=t.basicLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),e.alwaysIncludePattern||(e.alwaysIncludePattern=!1),e.mode=e.mode||384,Qc(e.filename,e.pattern,n,e,e.timezoneOffset)};var ea={};const ta=Nr.exports("log4js:fileSync"),na=p.default,ra=D.default,ua=E.default.EOL||"\n";function oa(e,t){if(ra.existsSync(e))return;const n=ra.openSync(e,t.flags,t.mode);ra.closeSync(n)}class ia{constructor(e,t,n,r){ta("In RollingFileStream"),function(){if(!e||!t||t<=0)throw new Error("You must specify a filename and file size")}(),this.filename=e,this.size=t,this.backups=n,this.options=r,this.currentSize=0,this.currentSize=function(e){let t=0;try{t=ra.statSync(e).size}catch(t){oa(e,r)}return t}(this.filename)}shouldRoll(){return ta("should roll with current size %d, and max size %d",this.currentSize,this.size),this.currentSize>=this.size}roll(e){const t=this,n=new RegExp(`^${na.basename(e)}`);function r(e){return n.test(e)}function u(t){return parseInt(t.substring(`${na.basename(e)}.`.length),10)||0}function o(e,t){return u(e)>u(t)?1:u(e) ${e}.${r+1}`),ra.renameSync(na.join(na.dirname(e),n),`${e}.${r+1}`)}}ta("Rolling, rolling, rolling"),ta("Renaming the old files"),ra.readdirSync(na.dirname(e)).filter(r).sort(o).reverse().forEach(i)}write(e,t){const n=this;ta("in write"),this.shouldRoll()&&(this.currentSize=0,this.roll(this.filename)),ta("writing the chunk to the file"),n.currentSize+=e.length,ra.appendFileSync(n.filename,e)}}ea.configure=function(e,t){let n=t.basicLayout;e.layout&&(n=t.layout(e.layout.type,e.layout));const r={flags:e.flags||"a",encoding:e.encoding||"utf8",mode:e.mode||384};return function(e,t,n,r,u,o){ta("fileSync appender created");const i=function(e,t,n){let r;var u;return t?r=new ia(e,t,n,o):(oa(u=e,o),r={write(e){ra.appendFileSync(u,e)}}),r}(e=na.normalize(e),n,r=r||0===r?r:5);return e=>{i.write(t(e,u)+ua)}}(e.filename,n,e.maxLogSize,e.backups,e.timezoneOffset,r)};var sa={};const ca=Nr.exports("log4js:tcp"),aa=S.default;sa.configure=function(e,t){ca(`configure with config = ${e}`);let n=function(e){return e.serialise()};return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){let n=!1;const r=[];let u,o=3,i="__LOG4JS__";function s(e){ca("Writing log event to socket"),n=u.write(`${t(e)}${i}`,"utf8")}function c(){let e;for(ca("emptying buffer");e=r.shift();)s(e)}function a(e){n?s(e):(ca("buffering log event because it cannot write at the moment"),r.push(e))}return function t(){ca(`appender creating socket to ${e.host||"localhost"}:${e.port||5e3}`),i=`${e.endMsg||"__LOG4JS__"}`,u=aa.createConnection(e.port||5e3,e.host||"localhost"),u.on("connect",(()=>{ca("socket connected"),c(),n=!0})),u.on("drain",(()=>{ca("drain event received, emptying buffer"),n=!0,c()})),u.on("timeout",u.end.bind(u)),u.on("error",(e=>{ca("connection error",e),n=!1,c()})),u.on("close",t)}(),a.shutdown=function(e){ca("shutdown called"),r.length&&o?(ca("buffer has items, waiting 100ms to empty"),o-=1,setTimeout((()=>{a.shutdown(e)}),100)):(u.removeAllListeners("close"),u.end(e))},a}(e,n)};const la=p.default,fa=Nr.exports("log4js:appenders"),da=tu,Da=eo,pa=gu,Ea=hu,ma=to,ha=new Map;ha.set("console",oo),ha.set("stdout",so),ha.set("stderr",co),ha.set("logLevelFilter",ao),ha.set("categoryFilter",lo),ha.set("noLogFilter",Do),ha.set("file",Eo),ha.set("dateFile",Yc),ha.set("fileSync",ea),ha.set("tcp",sa);const ya=new Map,Ca=(e,t)=>{fa("Loading module from ",e);try{return require(e)}catch(n){return void da.throwExceptionIf(t,"MODULE_NOT_FOUND"!==n.code,`appender "${e}" could not be loaded (error was: ${n})`)}},Fa=new Set,ga=(e,t)=>{if(ya.has(e))return ya.get(e);if(!t.appenders[e])return!1;if(Fa.has(e))throw new Error(`Dependency loop detected for appender ${e}.`);Fa.add(e),fa(`Creating appender ${e}`);const n=Aa(e,t);return Fa.delete(e),ya.set(e,n),n},Aa=(e,t)=>{const n=t.appenders[e],r=n.type.configure?n.type:((e,t)=>ha.get(e)||Ca(`./${e}`,t)||Ca(e,t)||require.main&&Ca(la.join(la.dirname(require.main.filename),e),t)||Ca(la.join(process.cwd(),e),t))(n.type,t);return da.throwExceptionIf(t,da.not(r),`appender "${e}" is not valid (type "${n.type}" could not be found)`),r.appender&&fa(`DEPRECATION: Appender ${n.type} exports an appender function.`),r.shutdown&&fa(`DEPRECATION: Appender ${n.type} exports a shutdown function.`),fa(`${e}: clustering.isMaster ? ${Da.isMaster()}`),fa(`${e}: appenderModule is ${F.default.inspect(r)}`),Da.onlyOnMaster((()=>(fa(`calling appenderModule.configure for ${e} / ${n.type}`),r.configure(ma.modifyConfig(n),Ea,(e=>ga(e,t)),pa))),(()=>{}))},va=e=>{ya.clear(),Fa.clear();const t=[];Object.values(e.categories).forEach((e=>{t.push(...e.appenders)})),Object.keys(e.appenders).forEach((n=>{(t.includes(n)||"tcp-server"===e.appenders[n].type)&&ga(n,e)}))},Sa=()=>{va({appenders:{out:{type:"stdout"}},categories:{default:{appenders:["out"],level:"trace"}}})};Sa(),da.addListener((e=>{da.throwExceptionIf(e,da.not(da.anObject(e.appenders)),'must have a property "appenders" of type object.');const t=Object.keys(e.appenders);da.throwExceptionIf(e,da.not(t.length),"must define at least one appender."),t.forEach((t=>{da.throwExceptionIf(e,da.not(e.appenders[t].type),`appender "${t}" is not valid (must be an object with property "type")`)}))})),da.addListener(va),Au.exports=ya,Au.exports.init=Sa;var wa={exports:{}};!function(e){const t=Nr.exports("log4js:categories"),n=tu,r=gu,u=Au.exports,o=new Map;function i(e,t,n){if(!1===t.inherit)return;const r=n.lastIndexOf(".");if(r<0)return;const u=n.substring(0,r);let o=e.categories[u];o||(o={inherit:!0,appenders:[]}),i(e,o,u),!e.categories[u]&&o.appenders&&o.appenders.length&&o.level&&(e.categories[u]=o),t.appenders=t.appenders||[],t.level=t.level||o.level,o.appenders.forEach((e=>{t.appenders.includes(e)||t.appenders.push(e)})),t.parent=o}function s(e){if(!e.categories)return;Object.keys(e.categories).forEach((t=>{const n=e.categories[t];i(e,n,t)}))}n.addPreProcessingListener((e=>s(e))),n.addListener((e=>{n.throwExceptionIf(e,n.not(n.anObject(e.categories)),'must have a property "categories" of type object.');const t=Object.keys(e.categories);n.throwExceptionIf(e,n.not(t.length),"must define at least one category."),t.forEach((t=>{const o=e.categories[t];n.throwExceptionIf(e,[n.not(o.appenders),n.not(o.level)],`category "${t}" is not valid (must be an object with properties "appenders" and "level")`),n.throwExceptionIf(e,n.not(Array.isArray(o.appenders)),`category "${t}" is not valid (appenders must be an array of appender names)`),n.throwExceptionIf(e,n.not(o.appenders.length),`category "${t}" is not valid (appenders must contain at least one appender name)`),Object.prototype.hasOwnProperty.call(o,"enableCallStack")&&n.throwExceptionIf(e,"boolean"!=typeof o.enableCallStack,`category "${t}" is not valid (enableCallStack must be boolean type)`),o.appenders.forEach((r=>{n.throwExceptionIf(e,n.not(u.get(r)),`category "${t}" is not valid (appender "${r}" is not defined)`)})),n.throwExceptionIf(e,n.not(r.getLevel(o.level)),`category "${t}" is not valid (level "${o.level}" not recognised; valid levels are ${r.levels.join(", ")})`)})),n.throwExceptionIf(e,n.not(e.categories.default),'must define a "default" category.')}));const c=e=>{o.clear();Object.keys(e.categories).forEach((n=>{const i=e.categories[n],s=[];i.appenders.forEach((e=>{s.push(u.get(e)),t(`Creating category ${n}`),o.set(n,{appenders:s,level:r.getLevel(i.level),enableCallStack:i.enableCallStack||!1})}))}))},a=()=>{c({categories:{default:{appenders:["out"],level:"OFF"}}})};a(),n.addListener(c);const l=e=>(t(`configForCategory: searching for config for ${e}`),o.has(e)?(t(`configForCategory: ${e} exists in config, returning it`),o.get(e)):e.indexOf(".")>0?(t(`configForCategory: ${e} has hierarchy, searching for parents`),l(e.substring(0,e.lastIndexOf(".")))):(t("configForCategory: returning config for default category"),l("default")));e.exports=o,e.exports=Object.assign(e.exports,{appendersForCategory:e=>l(e).appenders,getLevelForCategory:e=>l(e).level,setLevelForCategory:(e,n)=>{let r=o.get(e);if(t(`setLevelForCategory: found ${r} for ${e}`),!r){const n=l(e);t(`setLevelForCategory: no config found for category, found ${n} for parents of ${e}`),r={appenders:n.appenders}}r.level=n,o.set(e,r)},getEnableCallStackForCategory:e=>!0===l(e).enableCallStack,setEnableCallStackForCategory:(e,t)=>{l(e).enableCallStack=t},init:a})}(wa);const Oa=Nr.exports("log4js:logger"),ba=Hu,_a=gu,Ba=eo,Pa=wa.exports,ka=tu,xa=/at (?:(.+)\s+\()?(?:(.+?):(\d+)(?::(\d+))?|([^)]+))\)?/;function Na(e,t=4){const n=e.stack.split("\n").slice(t),r=xa.exec(n[0]);return r&&6===r.length?{functionName:r[1],fileName:r[2],lineNumber:parseInt(r[3],10),columnNumber:parseInt(r[4],10),callStack:n.join("\n")}:null}class Ia{constructor(e){if(!e)throw new Error("No category provided.");this.category=e,this.context={},this.parseCallStack=Na,Oa(`Logger created (${this.category}, ${this.level})`)}get level(){return _a.getLevel(Pa.getLevelForCategory(this.category),_a.TRACE)}set level(e){Pa.setLevelForCategory(this.category,_a.getLevel(e,this.level))}get useCallStack(){return Pa.getEnableCallStackForCategory(this.category)}set useCallStack(e){Pa.setEnableCallStackForCategory(this.category,!0===e)}log(e,...t){let n=_a.getLevel(e);n||(this._log(_a.WARN,"log4js:logger.log: invalid value for log-level as first parameter given: ",e),n=_a.INFO),this.isLevelEnabled(n)&&this._log(n,t)}isLevelEnabled(e){return this.level.isLessThanOrEqualTo(e)}_log(e,t){Oa(`sending log data (${e}) to appenders`);const n=new ba(this.category,e,t,this.context,this.useCallStack&&this.parseCallStack(new Error));Ba.send(n)}addContext(e,t){this.context[e]=t}removeContext(e){delete this.context[e]}clearContext(){this.context={}}setParseCallStackFunction(e){this.parseCallStack=e}}function Ta(e){const t=_a.getLevel(e),n=t.toString().toLowerCase().replace(/_([a-z])/g,(e=>e[1].toUpperCase())),r=n[0].toUpperCase()+n.slice(1);Ia.prototype[`is${r}Enabled`]=function(){return this.isLevelEnabled(t)},Ia.prototype[n]=function(...e){this.log(t,...e)}}_a.levels.forEach(Ta),ka.addListener((()=>{_a.levels.forEach(Ta)}));var Ra=Ia;const Ma=gu;function La(e){return e.originalUrl||e.url}function ja(e,t){for(let n=0;ne.source?e.source:e));t=new RegExp(n.join("|"))}return t}(t.nolog);return(e,i,s)=>{if(e._logging)return s();if(o&&o.test(e.originalUrl))return s();if(n.isLevelEnabled(r)||"auto"===t.level){const o=new Date,{writeHead:s}=i;e._logging=!0,i.writeHead=(e,t)=>{i.writeHead=s,i.writeHead(e,t),i.__statusCode=e,i.__headers=t||{}},i.on("finish",(()=>{i.responseTime=new Date-o,i.statusCode&&"auto"===t.level&&(r=Ma.INFO,i.statusCode>=300&&(r=Ma.WARN),i.statusCode>=400&&(r=Ma.ERROR)),r=function(e,t,n){let r=t;if(n){const t=n.find((t=>{let n=!1;return n=t.from&&t.to?e>=t.from&&e<=t.to:-1!==t.codes.indexOf(e),n}));t&&(r=Ma.getLevel(t.level,r))}return r}(i.statusCode,r,t.statusRules);const s=function(e,t,n){const r=[];return r.push({token:":url",replacement:La(e)}),r.push({token:":protocol",replacement:e.protocol}),r.push({token:":hostname",replacement:e.hostname}),r.push({token:":method",replacement:e.method}),r.push({token:":status",replacement:t.__statusCode||t.statusCode}),r.push({token:":response-time",replacement:t.responseTime}),r.push({token:":date",replacement:(new Date).toUTCString()}),r.push({token:":referrer",replacement:e.headers.referer||e.headers.referrer||""}),r.push({token:":http-version",replacement:`${e.httpVersionMajor}.${e.httpVersionMinor}`}),r.push({token:":remote-addr",replacement:e.headers["x-forwarded-for"]||e.ip||e._remoteAddress||e.socket&&(e.socket.remoteAddress||e.socket.socket&&e.socket.socket.remoteAddress)}),r.push({token:":user-agent",replacement:e.headers["user-agent"]}),r.push({token:":content-length",replacement:t.getHeader("content-length")||t.__headers&&t.__headers["Content-Length"]||"-"}),r.push({token:/:req\[([^\]]+)]/g,replacement:(t,n)=>e.headers[n.toLowerCase()]}),r.push({token:/:res\[([^\]]+)]/g,replacement:(e,n)=>t.getHeader(n.toLowerCase())||t.__headers&&t.__headers[n]}),(e=>{const t=e.concat();for(let e=0;eja(e,s)));t&&n.log(r,t)}else n.log(r,ja(u,s));t.context&&n.removeContext("res")}))}return s()}},nl=Va;let rl=!1;function ul(e){if(!rl)return;Ua("Received log event ",e);Za.appendersForCategory(e.categoryName).forEach((t=>{t(e)}))}function ol(e){rl&&il();let t=e;return"string"==typeof t&&(t=function(e){Ua(`Loading configuration from ${e}`);try{return JSON.parse(Wa.readFileSync(e,"utf8"))}catch(t){throw new Error(`Problem reading config from file "${e}". Error was ${t.message}`,t)}}(e)),Ua(`Configuration is ${t}`),Ka.configure(za(t)),el.onMessage(ul),rl=!0,sl}function il(e){Ua("Shutdown called. Disabling all log writing."),rl=!1;const t=Array.from(Xa.values());Xa.init(),Za.init();const n=t.reduceRight(((e,t)=>t.shutdown?e+1:e),0);if(0===n)return Ua("No appenders with shutdown functions found."),void 0!==e&&e();let r,u=0;function o(t){r=r||t,u+=1,Ua(`Appender shutdowns complete: ${u} / ${n}`),u>=n&&(Ua("All shutdown functions completed."),e&&e(r))}return Ua(`Found ${n} appenders with shutdown functions.`),t.filter((e=>e.shutdown)).forEach((e=>e.shutdown(o))),null}const sl={getLogger:function(e){return rl||ol(process.env.LOG4JS_CONFIG||{appenders:{out:{type:"stdout"}},categories:{default:{appenders:["out"],level:"OFF"}}}),new Qa(e||"default")},configure:ol,shutdown:il,connectLogger:tl,levels:Ya,addLayout:qa.addLayout,recording:function(){return nl}};var cl=sl,al={};Object.defineProperty(al,"__esModule",{value:!0}),al.levelMap=al.getLevel=al.setCategoriesLevel=al.getConfiguration=al.setConfiguration=void 0;const ll=cl;let fl={appenders:{debug:{type:"stdout",layout:{type:"pattern",pattern:"[%d] > hvigor %p %c %[%m%]"}},info:{type:"stdout",layout:{type:"pattern",pattern:"[%d] > hvigor %[%m%]"}},"no-pattern-info":{type:"stdout",layout:{type:"pattern",pattern:"%m"}},wrong:{type:"stderr",layout:{type:"pattern",pattern:"[%d] > hvigor %[%p: %m%]"}},"just-debug":{type:"logLevelFilter",appender:"debug",level:"debug",maxLevel:"debug"},"just-info":{type:"logLevelFilter",appender:"info",level:"info",maxLevel:"info"},"just-wrong":{type:"logLevelFilter",appender:"wrong",level:"warn",maxLevel:"error"}},categories:{default:{appenders:["just-debug","just-info","just-wrong"],level:"debug"},"no-pattern-info":{appenders:["no-pattern-info"],level:"info"}}};al.setConfiguration=e=>{fl=e};al.getConfiguration=()=>fl;let dl=ll.levels.DEBUG;al.setCategoriesLevel=(e,t)=>{dl=e;const n=fl.categories;for(const r in n)(null==t?void 0:t.includes(r))||Object.prototype.hasOwnProperty.call(n,r)&&(n[r].level=e.levelStr)};al.getLevel=()=>dl,al.levelMap=new Map([["ALL",ll.levels.ALL],["MARK",ll.levels.MARK],["TRACE",ll.levels.TRACE],["DEBUG",ll.levels.DEBUG],["INFO",ll.levels.INFO],["WARN",ll.levels.WARN],["ERROR",ll.levels.ERROR],["FATAL",ll.levels.FATAL],["OFF",ll.levels.OFF]]);var Dl=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),pl=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),El=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&Dl(t,e,n);return pl(t,e),t};Object.defineProperty(xr,"__esModule",{value:!0}),xr.evaluateLogLevel=xr.HvigorLogger=void 0;const ml=El(cl),hl=cl,yl=El(F.default),Cl=al;class Fl{constructor(e){ml.configure((0,Cl.getConfiguration)()),this._logger=ml.getLogger(e),this._logger.level=(0,Cl.getLevel)()}static getLogger(e){return new Fl(e)}log(e,...t){this._logger.log(e,...t)}debug(e,...t){this._logger.debug(e,...t)}info(e,...t){this._logger.info(e,...t)}warn(e,...t){void 0!==e&&""!==e&&this._logger.warn(e,...t)}error(e,...t){this._logger.error(e,...t)}_printTaskExecuteInfo(e,t){this.info(`Finished :${e}... after ${t}`)}_printFailedTaskInfo(e){this.error(`Failed :${e}... `)}_printDisabledTaskInfo(e){this.info(`Disabled :${e}... `)}_printUpToDateTaskInfo(e){this.info(`UP-TO-DATE :${e}... `)}errorMessageExit(e,...t){throw new Error(yl.format(e,...t))}errorExit(e,t,...n){t&&this._logger.error(t,n),this._logger.error(e.stack)}setLevel(e,t){(0,Cl.setCategoriesLevel)(e,t),ml.shutdown(),ml.configure((0,Cl.getConfiguration)())}getLevel(){return this._logger.level}configure(e){const t=(0,Cl.getConfiguration)(),n={appenders:{...t.appenders,...e.appenders},categories:{...t.categories,...e.categories}};(0,Cl.setConfiguration)(n),ml.shutdown(),ml.configure(n)}}xr.HvigorLogger=Fl,xr.evaluateLogLevel=function(e,t){t.debug?e.setLevel(hl.levels.DEBUG):t.warn?e.setLevel(hl.levels.WARN):t.error?e.setLevel(hl.levels.ERROR):e.setLevel(hl.levels.INFO)};var gl=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(X,"__esModule",{value:!0}),X.parseJsonText=X.parseJsonFile=void 0;const Al=Z,vl=gl(kr),Sl=gl(p.default),wl=gl(E.default),Ol=xr.HvigorLogger.getLogger("parse-json-util");var bl;!function(e){e[e.Char=0]="Char",e[e.EOF=1]="EOF",e[e.Identifier=2]="Identifier"}(bl||(bl={}));let _l,Bl,Pl,kl,xl,Nl,Il="start",Tl=[],Rl=0,Ml=1,Ll=0,jl=!1,$l="default",Hl="'",Jl=1;function Gl(e,t=!1){Bl=String(e),Il="start",Tl=[],Rl=0,Ml=1,Ll=0,kl=void 0,jl=t;do{_l=Vl(),Xl[Il]()}while("eof"!==_l.type);return kl}function Vl(){for($l="default",xl="",Hl="'",Jl=1;;){Nl=Ul();const e=zl[$l]();if(e)return e}}function Ul(){if(Bl[Rl])return String.fromCodePoint(Bl.codePointAt(Rl))}function Wl(){const e=Ul();return"\n"===e?(Ml++,Ll=0):e?Ll+=e.length:Ll++,e&&(Rl+=e.length),e}X.parseJsonFile=function(e,t=!1,n="utf-8"){const r=vl.default.readFileSync(Sl.default.resolve(e),{encoding:n});try{return Gl(r,t)}catch(t){if(t instanceof SyntaxError){const n=t.message.split("at");2===n.length&&Ol.errorMessageExit(`${n[0].trim()}${wl.default.EOL}\t at ${e}:${n[1].trim()}`)}Ol.errorMessageExit(`${e} is not in valid JSON/JSON5 format.`)}},X.parseJsonText=Gl;const zl={default(){switch(Nl){case"/":return Wl(),void($l="comment");case void 0:return Wl(),Kl("eof")}if(!Al.JudgeUtil.isIgnoreChar(Nl)&&!Al.JudgeUtil.isSpaceSeparator(Nl))return zl[Il]();Wl()},start(){$l="value"},beforePropertyName(){switch(Nl){case"$":case"_":return xl=Wl(),void($l="identifierName");case"\\":return Wl(),void($l="identifierNameStartEscape");case"}":return Kl("punctuator",Wl());case'"':case"'":return Hl=Nl,Wl(),void($l="string")}if(Al.JudgeUtil.isIdStartChar(Nl))return xl+=Wl(),void($l="identifierName");throw tf(bl.Char,Wl())},afterPropertyName(){if(":"===Nl)return Kl("punctuator",Wl());throw tf(bl.Char,Wl())},beforePropertyValue(){$l="value"},afterPropertyValue(){switch(Nl){case",":case"}":return Kl("punctuator",Wl())}throw tf(bl.Char,Wl())},beforeArrayValue(){if("]"===Nl)return Kl("punctuator",Wl());$l="value"},afterArrayValue(){switch(Nl){case",":case"]":return Kl("punctuator",Wl())}throw tf(bl.Char,Wl())},end(){throw tf(bl.Char,Wl())},comment(){switch(Nl){case"*":return Wl(),void($l="multiLineComment");case"/":return Wl(),void($l="singleLineComment")}throw tf(bl.Char,Wl())},multiLineComment(){switch(Nl){case"*":return Wl(),void($l="multiLineCommentAsterisk");case void 0:throw tf(bl.Char,Wl())}Wl()},multiLineCommentAsterisk(){switch(Nl){case"*":return void Wl();case"/":return Wl(),void($l="default");case void 0:throw tf(bl.Char,Wl())}Wl(),$l="multiLineComment"},singleLineComment(){switch(Nl){case"\n":case"\r":case"\u2028":case"\u2029":return Wl(),void($l="default");case void 0:return Wl(),Kl("eof")}Wl()},value(){switch(Nl){case"{":case"[":return Kl("punctuator",Wl());case"n":return Wl(),ql("ull"),Kl("null",null);case"t":return Wl(),ql("rue"),Kl("boolean",!0);case"f":return Wl(),ql("alse"),Kl("boolean",!1);case"-":case"+":return"-"===Wl()&&(Jl=-1),void($l="numerical");case".":case"0":case"I":case"N":return void($l="numerical");case'"':case"'":return Hl=Nl,Wl(),xl="",void($l="string")}if(void 0===Nl||!Al.JudgeUtil.isDigitWithoutZero(Nl))throw tf(bl.Char,Wl());$l="numerical"},numerical(){switch(Nl){case".":return xl=Wl(),void($l="decimalPointLeading");case"0":return xl=Wl(),void($l="zero");case"I":return Wl(),ql("nfinity"),Kl("numeric",Jl*(1/0));case"N":return Wl(),ql("aN"),Kl("numeric",NaN)}if(void 0!==Nl&&Al.JudgeUtil.isDigitWithoutZero(Nl))return xl=Wl(),void($l="decimalInteger");throw tf(bl.Char,Wl())},zero(){switch(Nl){case".":case"e":case"E":return void($l="decimal");case"x":case"X":return xl+=Wl(),void($l="hexadecimal")}return Kl("numeric",0)},decimalInteger(){switch(Nl){case".":case"e":case"E":return void($l="decimal")}if(!Al.JudgeUtil.isDigit(Nl))return Kl("numeric",Jl*Number(xl));xl+=Wl()},decimal(){switch(Nl){case".":xl+=Wl(),$l="decimalFraction";break;case"e":case"E":xl+=Wl(),$l="decimalExponent"}},decimalPointLeading(){if(Al.JudgeUtil.isDigit(Nl))return xl+=Wl(),void($l="decimalFraction");throw tf(bl.Char,Wl())},decimalFraction(){switch(Nl){case"e":case"E":return xl+=Wl(),void($l="decimalExponent")}if(!Al.JudgeUtil.isDigit(Nl))return Kl("numeric",Jl*Number(xl));xl+=Wl()},decimalExponent(){switch(Nl){case"+":case"-":return xl+=Wl(),void($l="decimalExponentSign")}if(Al.JudgeUtil.isDigit(Nl))return xl+=Wl(),void($l="decimalExponentInteger");throw tf(bl.Char,Wl())},decimalExponentSign(){if(Al.JudgeUtil.isDigit(Nl))return xl+=Wl(),void($l="decimalExponentInteger");throw tf(bl.Char,Wl())},decimalExponentInteger(){if(!Al.JudgeUtil.isDigit(Nl))return Kl("numeric",Jl*Number(xl));xl+=Wl()},hexadecimal(){if(Al.JudgeUtil.isHexDigit(Nl))return xl+=Wl(),void($l="hexadecimalInteger");throw tf(bl.Char,Wl())},hexadecimalInteger(){if(!Al.JudgeUtil.isHexDigit(Nl))return Kl("numeric",Jl*Number(xl));xl+=Wl()},identifierNameStartEscape(){if("u"!==Nl)throw tf(bl.Char,Wl());Wl();const e=Yl();switch(e){case"$":case"_":break;default:if(!Al.JudgeUtil.isIdStartChar(e))throw tf(bl.Identifier)}xl+=e,$l="identifierName"},identifierName(){switch(Nl){case"$":case"_":case"":case"":return void(xl+=Wl());case"\\":return Wl(),void($l="identifierNameEscape")}if(!Al.JudgeUtil.isIdContinueChar(Nl))return Kl("identifier",xl);xl+=Wl()},identifierNameEscape(){if("u"!==Nl)throw tf(bl.Char,Wl());Wl();const e=Yl();switch(e){case"$":case"_":case"":case"":break;default:if(!Al.JudgeUtil.isIdContinueChar(e))throw tf(bl.Identifier)}xl+=e,$l="identifierName"},string(){switch(Nl){case"\\":return Wl(),void(xl+=function(){const e=Ul(),t=function(){switch(Ul()){case"b":return Wl(),"\b";case"f":return Wl(),"\f";case"n":return Wl(),"\n";case"r":return Wl(),"\r";case"t":return Wl(),"\t";case"v":return Wl(),"\v"}return}();if(t)return t;switch(e){case"0":if(Wl(),Al.JudgeUtil.isDigit(Ul()))throw tf(bl.Char,Wl());return"\0";case"x":return Wl(),function(){let e="",t=Ul();if(!Al.JudgeUtil.isHexDigit(t))throw tf(bl.Char,Wl());if(e+=Wl(),t=Ul(),!Al.JudgeUtil.isHexDigit(t))throw tf(bl.Char,Wl());return e+=Wl(),String.fromCodePoint(parseInt(e,16))}();case"u":return Wl(),Yl();case"\n":case"\u2028":case"\u2029":return Wl(),"";case"\r":return Wl(),"\n"===Ul()&&Wl(),""}if(void 0===e||Al.JudgeUtil.isDigitWithoutZero(e))throw tf(bl.Char,Wl());return Wl()}());case'"':case"'":if(Nl===Hl){const e=Kl("string",xl);return Wl(),e}return void(xl+=Wl());case"\n":case"\r":case void 0:throw tf(bl.Char,Wl());case"\u2028":case"\u2029":!function(e){Ol.warn(`JSON5: '${ef(e)}' in strings is not valid ECMAScript; consider escaping.`)}(Nl)}xl+=Wl()}};function Kl(e,t){return{type:e,value:t,line:Ml,column:Ll}}function ql(e){for(const t of e){if(Ul()!==t)throw tf(bl.Char,Wl());Wl()}}function Yl(){let e="",t=4;for(;t-- >0;){const t=Ul();if(!Al.JudgeUtil.isHexDigit(t))throw tf(bl.Char,Wl());e+=Wl()}return String.fromCodePoint(parseInt(e,16))}const Xl={start(){if("eof"===_l.type)throw tf(bl.EOF);Zl()},beforePropertyName(){switch(_l.type){case"identifier":case"string":return Pl=_l.value,void(Il="afterPropertyName");case"punctuator":return void Ql();case"eof":throw tf(bl.EOF)}},afterPropertyName(){if("eof"===_l.type)throw tf(bl.EOF);Il="beforePropertyValue"},beforePropertyValue(){if("eof"===_l.type)throw tf(bl.EOF);Zl()},afterPropertyValue(){if("eof"===_l.type)throw tf(bl.EOF);switch(_l.value){case",":return void(Il="beforePropertyName");case"}":Ql()}},beforeArrayValue(){if("eof"===_l.type)throw tf(bl.EOF);"punctuator"!==_l.type||"]"!==_l.value?Zl():Ql()},afterArrayValue(){if("eof"===_l.type)throw tf(bl.EOF);switch(_l.value){case",":return void(Il="beforeArrayValue");case"]":Ql()}},end(){}};function Zl(){const e=function(){let e;switch(_l.type){case"punctuator":switch(_l.value){case"{":e={};break;case"[":e=[]}break;case"null":case"boolean":case"numeric":case"string":e=_l.value}return e}();if(jl&&"object"==typeof e&&(e._line=Ml,e._column=Ll),void 0===kl)kl=e;else{const t=Tl[Tl.length-1];Array.isArray(t)?jl&&"object"!=typeof e?t.push({value:e,_line:Ml,_column:Ll}):t.push(e):t[Pl]=jl&&"object"!=typeof e?{value:e,_line:Ml,_column:Ll}:e}!function(e){if(e&&"object"==typeof e)Tl.push(e),Il=Array.isArray(e)?"beforeArrayValue":"beforePropertyName";else{const e=Tl[Tl.length-1];Il=e?Array.isArray(e)?"afterArrayValue":"afterPropertyValue":"end"}}(e)}function Ql(){Tl.pop();const e=Tl[Tl.length-1];Il=e?Array.isArray(e)?"afterArrayValue":"afterPropertyValue":"end"}function ef(e){const t={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(t[e])return t[e];if(e<" "){const t=e.charCodeAt(0).toString(16);return`\\x${`00${t}`.substring(t.length)}`}return e}function tf(e,t){let n="";switch(e){case bl.Char:n=void 0===t?`JSON5: invalid end of input at ${Ml}:${Ll}`:`JSON5: invalid character '${ef(t)}' at ${Ml}:${Ll}`;break;case bl.EOF:n=`JSON5: invalid end of input at ${Ml}:${Ll}`;break;case bl.Identifier:Ll-=5,n=`JSON5: invalid identifier character at ${Ml}:${Ll}`}const r=new nf(n);return r.lineNumber=Ml,r.columnNumber=Ll,r}class nf extends SyntaxError{}var rf=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),uf=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),of=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&rf(t,e,n);return uf(t,e),t};Object.defineProperty(Y,"__esModule",{value:!0});var sf=Y.cleanWorkSpace=Ff=Y.executeInstallHvigor=yf=Y.isHvigorInstalled=mf=Y.isAllDependenciesInstalled=void 0;const cf=of(D.default),af=of(p.default),lf=b,ff=j,df=$,Df=X;let pf,Ef;var mf=Y.isAllDependenciesInstalled=function(){function e(e){const t=null==e?void 0:e.dependencies;return void 0===t?0:Object.getOwnPropertyNames(t).length}if(pf=gf(),Ef=Af(),e(pf)+1!==e(Ef))return!1;for(const e in null==pf?void 0:pf.dependencies)if(!(0,ff.hasNpmPackInPaths)(e,[lf.HVIGOR_PROJECT_DEPENDENCIES_HOME])||!hf(e,pf,Ef))return!1;return!0};function hf(e,t,n){return void 0!==n.dependencies&&(0,ff.offlinePluginConversion)(lf.HVIGOR_PROJECT_ROOT_DIR,t.dependencies[e])===n.dependencies[e]}var yf=Y.isHvigorInstalled=function(){return pf=gf(),Ef=Af(),(0,ff.hasNpmPackInPaths)(lf.HVIGOR_ENGINE_PACKAGE_NAME,[lf.HVIGOR_PROJECT_DEPENDENCIES_HOME])&&(0,ff.offlinePluginConversion)(lf.HVIGOR_PROJECT_ROOT_DIR,pf.hvigorVersion)===Ef.dependencies[lf.HVIGOR_ENGINE_PACKAGE_NAME]};const Cf={cwd:lf.HVIGOR_PROJECT_DEPENDENCIES_HOME,stdio:["inherit","inherit","inherit"]};var Ff=Y.executeInstallHvigor=function(){(0,df.logInfoPrintConsole)("Hvigor installing...");const e={dependencies:{}};e.dependencies[lf.HVIGOR_ENGINE_PACKAGE_NAME]=(0,ff.offlinePluginConversion)(lf.HVIGOR_PROJECT_ROOT_DIR,pf.hvigorVersion);try{cf.mkdirSync(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME,{recursive:!0});const t=af.resolve(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME,lf.DEFAULT_PACKAGE_JSON);cf.writeFileSync(t,JSON.stringify(e))}catch(e){(0,df.logErrorAndExit)(e)}!function(){const e=["config","set","store-dir",lf.HVIGOR_PNPM_STORE_PATH];(0,ff.executeCommand)(lf.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,e,Cf)}(),(0,ff.executeCommand)(lf.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,["install"],Cf)};function gf(){const e=af.resolve(lf.HVIGOR_PROJECT_WRAPPER_HOME,lf.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);return cf.existsSync(e)||(0,df.logErrorAndExit)(`Error: Hvigor config file ${e} does not exist.`),(0,Df.parseJsonFile)(e)}function Af(){return cf.existsSync(lf.HVIGOR_PROJECT_DEPENDENCY_PACKAGE_JSON_PATH)?(0,Df.parseJsonFile)(lf.HVIGOR_PROJECT_DEPENDENCY_PACKAGE_JSON_PATH):{dependencies:{}}}sf=Y.cleanWorkSpace=function(){if((0,df.logInfoPrintConsole)("Hvigor cleaning..."),!cf.existsSync(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME))return;const e=cf.readdirSync(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME);if(e&&0!==e.length){cf.existsSync(lf.HVIGOR_BOOT_JS_FILE_PATH)&&(0,ff.executeCommand)(process.argv[0],[lf.HVIGOR_BOOT_JS_FILE_PATH,"--stop-daemon"],{});try{e.forEach((e=>{cf.rmSync(af.resolve(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME,e),{recursive:!0})}))}catch(e){(0,df.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${lf.HVIGOR_PROJECT_DEPENDENCIES_HOME}.`)}}};var vf={},Sf=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),wf=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Of=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&Sf(t,e,n);return wf(t,e),t};Object.defineProperty(vf,"__esModule",{value:!0});var bf=vf.executeBuild=void 0;const _f=b,Bf=Of(D.default),Pf=Of(p.default),kf=$;bf=vf.executeBuild=function(){const e=Pf.resolve(_f.HVIGOR_PROJECT_DEPENDENCIES_HOME,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const t=Bf.realpathSync(e);require(t)}catch(t){(0,kf.logErrorAndExit)(`Error: ENOENT: no such file ${e},delete ${_f.HVIGOR_PROJECT_DEPENDENCIES_HOME} and retry.`)}},function(){if(O.checkNpmConifg(),O.environmentHandler(),O.isPnpmAvailable()||O.executeInstallPnpm(),yf()&&mf())bf();else{sf();try{Ff()}catch(e){return void sf()}bf()}}();
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigorfile.ts b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigorfile.ts
new file mode 100644
index 0000000000000000000000000000000000000000..de76d0675bc13811fab0d07317942dc5efef4b54
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigorfile.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2023 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
+export { appTasks } from '@ohos/hvigor-ohos-plugin';
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigorw b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigorw
new file mode 100644
index 0000000000000000000000000000000000000000..2a70dc127d52200fc4b276b00ca6b7caa239bc62
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigorw
@@ -0,0 +1,63 @@
+#
+# Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#!/bin/bash
+
+# ----------------------------------------------------------------------------
+# Hvigor startup script, version 1.0.0
+#
+# Required ENV vars:
+# ------------------
+# NODE_HOME - location of a Node home dir
+# or
+# Add /usr/local/nodejs/bin to the PATH environment variable
+# ----------------------------------------------------------------------------
+
+HVIGOR_APP_HOME=$(dirname $(readlink -f $0))
+HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js
+warn() {
+ echo ""
+ echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
+}
+
+error() {
+ echo ""
+ echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
+}
+
+fail() {
+ error "$@"
+ exit 1
+}
+
+# Determine node to start hvigor wrapper script
+if [ -n "${NODE_HOME}" ];then
+ EXECUTABLE_NODE="${NODE_HOME}/bin/node"
+ if [ ! -x "$EXECUTABLE_NODE" ];then
+ fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed"
+ fi
+else
+ EXECUTABLE_NODE="node"
+ which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path"
+fi
+
+# Check hvigor wrapper script
+if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then
+ fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}"
+fi
+
+# start hvigor-wrapper script
+exec "${EXECUTABLE_NODE}" \
+ "${HVIGOR_WRAPPER_SCRIPT}" "$@"
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigorw.bat b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigorw.bat
new file mode 100644
index 0000000000000000000000000000000000000000..9c0bce666c29dcc3ef35dae78c7be9cafa1267ae
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/hvigorw.bat
@@ -0,0 +1,79 @@
+#
+# Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Hvigor startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js
+set NODE_EXE=node.exe
+
+goto start
+
+:start
+@rem Find node.exe
+if defined NODE_HOME goto findNodeFromNodeHome
+
+%NODE_EXE% --version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
+echo.
+echo Please set the NODE_HOME variable in your environment to match the
+echo location of your NodeJs installation.
+
+goto fail
+
+:findNodeFromNodeHome
+set NODE_HOME=%NODE_HOME:"=%
+set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE%
+
+if exist "%NODE_EXE_PATH%" goto execute
+echo.
+echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
+echo.
+echo Please set the NODE_HOME variable in your environment to match the
+echo location of your NodeJs installation.
+
+goto fail
+
+:execute
+@rem Execute hvigor
+"%NODE_EXE%" %WRAPPER_MODULE_PATH% %*
+
+if "%ERRORLEVEL%" == "0" goto hvigorwEnd
+
+:fail
+exit /b 1
+
+:hvigorwEnd
+if "%OS%" == "Windows_NT" endlocal
+
+:end
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/local.properties b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/local.properties
new file mode 100644
index 0000000000000000000000000000000000000000..864e8480e5edabc3faccd6c365441bf21a0d27da
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/local.properties
@@ -0,0 +1,9 @@
+# This file is automatically generated by DevEco Studio.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file should *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+#
+# For customization when using a Version Control System, please read the header note.
+nodejs.dir=C:/Users/hched/node/node-16.20.1
+hwsdk.dir=C:/Users/hched/AppData/Local/Huawei/Sdk
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh-package-lock.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh-package-lock.json5
new file mode 100644
index 0000000000000000000000000000000000000000..8117ee588b7b4e9899feee78e294b5fbb14fbc3f
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh-package-lock.json5
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "lockfileVersion": 1,
+ "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
+ "specifiers": {
+ "@ohos/hypium@1.0.6": "@ohos/hypium@1.0.6"
+ },
+ "packages": {
+ "@ohos/hypium@1.0.6": {
+ "resolved": "https://repo.harmonyos.com/ohpm/@ohos/hypium/-/hypium-1.0.6.tgz",
+ "integrity": "sha512-bb3DWeWhYrFqj9mPFV3yZQpkm36kbcK+YYaeY9g292QKSjOdmhEIQR2ULPvyMsgSR4usOBf5nnYrDmaCCXirgQ=="
+ }
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh-package.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..541f70556af34058c8eb3256c62730cfd762d214
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh-package.json5
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "license": "",
+ "devDependencies": {
+ "@ohos/hypium": "1.0.6"
+ },
+ "author": "",
+ "name": "path_provider",
+ "description": "Please describe the basic information.",
+ "main": "",
+ "version": "1.0.0",
+ "dependencies": {}
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/CHANGELOG.md b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/README.md b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/index.d.ts b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/index.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b0b4394a3284c07e873e84c9144cd31889e1863d
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/index.d.ts
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export const DEFAULT = 0B0000
+
+export const when: when;
+
+export enum TestType {
+ FUNCTION = 0B1,
+ PERFORMANCE = 0B1 << 1,
+ POWER = 0B1 << 2,
+ RELIABILITY = 0B1 << 3,
+ SECURITY = 0B1 << 4,
+ GLOBAL = 0B1 << 5,
+ COMPATIBILITY = 0B1 << 6,
+ USER = 0B1 << 7,
+ STANDARD = 0B1 << 8,
+ SAFETY = 0B1 << 9,
+ RESILIENCE = 0B1 << 10
+}
+
+export enum Size {
+ SMALLTEST = 0B1 << 16,
+ MEDIUMTEST = 0B1 << 17,
+ LARGETEST = 0B1 << 18
+}
+
+export enum Level {
+ LEVEL0 = 0B1 << 24,
+ LEVEL1 = 0B1 << 25,
+ LEVEL2 = 0B1 << 26,
+ LEVEL3 = 0B1 << 27,
+ LEVEL4 = 0B1 << 28
+}
+
+export function describe(testSuiteName: string, callback: Function): void
+
+export function beforeEach(callback: Function): void
+
+export function afterEach(callback: Function): void
+
+export function beforeAll(callback: Function): void
+
+export function afterAll(callback: Function): void
+
+export function it(testCaseName: string, attribute: (TestType | Size | Level), callback: Function)
+
+export interface Assert {
+ assertClose(expectValue: number, precision: number): void
+ assertContain(expectValue: any): void
+ assertEqual(expectValue: any): void
+ assertFail(): void
+ assertFalse(): void
+ assertTrue(): void
+ assertInstanceOf(expectValue: string): void
+ assertLarger(expectValue: number): void
+ assertLess(expectValue: number): void
+ assertNull(): void
+ assertThrowError(expectValue: string): void
+ assertUndefined(): void
+ assertLargerOrEqual(expectValue: number):void
+ assertLessOrEqual(expectValue: number):void
+ assertNaN():void
+ assertNegUnlimited(): void
+ assertPosUnlimited(): void
+ not(): Assert;
+ assertDeepEquals(expectValue: any):void
+ assertPromiseIsPending(): void
+ assertPromiseIsRejected(): void
+ assertPromiseIsRejectedWith(expectValue?: any): void
+ assertPromiseIsRejectedWithError(...expectValue): void
+ assertPromiseIsResolved(): void
+ assertPromiseIsResolvedWith(expectValue?: any): void
+}
+
+export function expect(actualValue?: any): Assert
+
+export class ArgumentMatchers {
+ static any;
+ static anyString;
+ static anyBoolean;
+ static anyNumber;
+ static anyObj;
+ static anyFunction;
+ static matchRegexs(Regex: RegExp): void
+}
+
+declare interface when {
+ afterReturn(value: any): any
+ afterReturnNothing(): undefined
+ afterAction(action: any): any
+ afterThrow(e_msg: string): string
+ (argMatchers?: any): when;
+}
+
+export interface VerificationMode {
+ times(count: Number): void
+ never(): void
+ once(): void
+ atLeast(count: Number): void
+ atMost(count: Number): void
+}
+
+export class MockKit {
+ constructor()
+ mockFunc(obj: Object, func: Function): Function
+ mockObject(obj: Object): Object
+ verify(methodName: String, argsArray: Array): VerificationMode
+ ignoreMock(obj: Object, func: Function): void
+ clear(obj: Object): void
+ clearAll(): void
+}
+
+export class SysTestKit {
+ static actionStart(tag: string): void
+ static actionEnd(tag: string): void
+ static existKeyword(keyword: string, timeout?: number): boolean
+}
+
+export class Hypium {
+ static setData(data: {[key: string]: any}): void
+ static setTimeConfig(systemTime: any)
+ static hypiumTest(abilityDelegator: any, abilityDelegatorArguments: any, testsuite: Function): void
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/index.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/index.ets
new file mode 100644
index 0000000000000000000000000000000000000000..3c3fe31746bcc2d00e4f8b33e67be5c5a26f9d22
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/index.ets
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Core from './src/main/core';
+import {DEFAULT, TestType, Size, Level} from './src/main/Constant';
+import DataDriver from './src/main/module/config/DataDriver';
+import ExpectExtend from './src/main/module/assert/ExpectExtend';
+import OhReport from './src/main/module/report/OhReport';
+import SysTestKit from './src/main/module/kit/SysTestKit';
+import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from './src/main/interface';
+import {MockKit, when} from './src/main/module/mock/MockKit';
+import ArgumentMatchers from './src/main/module/mock/ArgumentMatchers';
+
+class Hypium {
+ static setData(data) {
+ const core = Core.getInstance();
+ const dataDriver = new DataDriver({data});
+ core.addService('dataDriver', dataDriver);
+ }
+
+ static setTimeConfig(systemTime) {
+ SysTestKit.systemTime = systemTime;
+ }
+
+ static hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite) {
+ const core = Core.getInstance();
+ const expectExtend = new ExpectExtend({
+ 'id': 'extend'
+ });
+ core.addService('expect', expectExtend);
+ const ohReport = new OhReport({
+ 'delegator': abilityDelegator,
+ 'abilityDelegatorArguments': abilityDelegatorArguments
+ });
+ SysTestKit.delegator = abilityDelegator;
+ core.addService('report', ohReport);
+ core.init();
+ core.subscribeEvent('spec', ohReport);
+ core.subscribeEvent('suite', ohReport);
+ core.subscribeEvent('task', ohReport);
+ const configService = core.getDefaultService('config');
+
+ let testParameters = {};
+ if (abilityDelegatorArguments !== null) {
+ testParameters = configService.translateParams(abilityDelegatorArguments.parameters);
+ }
+ console.info('parameters:' + JSON.stringify(testParameters));
+ configService.setConfig(testParameters);
+
+ testsuite();
+ if (Object.prototype.hasOwnProperty.call(globalThis, 'setupUiTestEnvironment')) {
+ globalThis.setupUiTestEnvironment().then(() => {
+ console.info('UiTestKit::after run uitest setup, start run testcases');
+ core.execute(abilityDelegator);
+ }).catch((error) => {
+ console.error('UiTestKit:: call setupUiTestEnvironment failure:' + error);
+ core.execute(abilityDelegator);
+ });
+ } else {
+ console.info('UiTestKit:: no need to setup uitest, start run testcases');
+ core.execute(abilityDelegator);
+ }
+ }
+}
+
+export {
+ Hypium,
+ Core,
+ DEFAULT,
+ TestType,
+ Size,
+ Level,
+ DataDriver,
+ ExpectExtend,
+ OhReport,
+ SysTestKit,
+ describe, beforeAll, beforeEach, afterEach, afterAll, it, expect,
+ MockKit, when,
+ ArgumentMatchers
+};
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/index.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c3fe31746bcc2d00e4f8b33e67be5c5a26f9d22
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/index.js
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Core from './src/main/core';
+import {DEFAULT, TestType, Size, Level} from './src/main/Constant';
+import DataDriver from './src/main/module/config/DataDriver';
+import ExpectExtend from './src/main/module/assert/ExpectExtend';
+import OhReport from './src/main/module/report/OhReport';
+import SysTestKit from './src/main/module/kit/SysTestKit';
+import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from './src/main/interface';
+import {MockKit, when} from './src/main/module/mock/MockKit';
+import ArgumentMatchers from './src/main/module/mock/ArgumentMatchers';
+
+class Hypium {
+ static setData(data) {
+ const core = Core.getInstance();
+ const dataDriver = new DataDriver({data});
+ core.addService('dataDriver', dataDriver);
+ }
+
+ static setTimeConfig(systemTime) {
+ SysTestKit.systemTime = systemTime;
+ }
+
+ static hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite) {
+ const core = Core.getInstance();
+ const expectExtend = new ExpectExtend({
+ 'id': 'extend'
+ });
+ core.addService('expect', expectExtend);
+ const ohReport = new OhReport({
+ 'delegator': abilityDelegator,
+ 'abilityDelegatorArguments': abilityDelegatorArguments
+ });
+ SysTestKit.delegator = abilityDelegator;
+ core.addService('report', ohReport);
+ core.init();
+ core.subscribeEvent('spec', ohReport);
+ core.subscribeEvent('suite', ohReport);
+ core.subscribeEvent('task', ohReport);
+ const configService = core.getDefaultService('config');
+
+ let testParameters = {};
+ if (abilityDelegatorArguments !== null) {
+ testParameters = configService.translateParams(abilityDelegatorArguments.parameters);
+ }
+ console.info('parameters:' + JSON.stringify(testParameters));
+ configService.setConfig(testParameters);
+
+ testsuite();
+ if (Object.prototype.hasOwnProperty.call(globalThis, 'setupUiTestEnvironment')) {
+ globalThis.setupUiTestEnvironment().then(() => {
+ console.info('UiTestKit::after run uitest setup, start run testcases');
+ core.execute(abilityDelegator);
+ }).catch((error) => {
+ console.error('UiTestKit:: call setupUiTestEnvironment failure:' + error);
+ core.execute(abilityDelegator);
+ });
+ } else {
+ console.info('UiTestKit:: no need to setup uitest, start run testcases');
+ core.execute(abilityDelegator);
+ }
+ }
+}
+
+export {
+ Hypium,
+ Core,
+ DEFAULT,
+ TestType,
+ Size,
+ Level,
+ DataDriver,
+ ExpectExtend,
+ OhReport,
+ SysTestKit,
+ describe, beforeAll, beforeEach, afterEach, afterAll, it, expect,
+ MockKit, when,
+ ArgumentMatchers
+};
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/oh-package.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..74b3beaa21ce731c12319a495381b9ec9297c751
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/oh-package.json5
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "name": "@ohos/hypium",
+ "version": "1.0.6",
+ "description": "A unit test framework for OpenHarmony application",
+ "main": "index.js",
+ "keywords": [],
+ "author": "huawei",
+ "license": "Apache-2.0",
+ "dependencies": {
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/Constant.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/Constant.js
new file mode 100644
index 0000000000000000000000000000000000000000..f1829107720a64df7b571a4bfd11a25e6d9022b6
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/Constant.js
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * define the testcase type : TestType, Size , Level
+ */
+export const DEFAULT = 0B0000;
+
+export class TestType {
+ static FUNCTION = 0B1;
+ static PERFORMANCE = 0B1 << 1;
+ static POWER = 0B1 << 2;
+ static RELIABILITY = 0B1 << 3;
+ static SECURITY = 0B1 << 4;
+ static GLOBAL = 0B1 << 5;
+ static COMPATIBILITY = 0B1 << 6;
+ static USER = 0B1 << 7;
+ static STANDARD = 0B1 << 8;
+ static SAFETY = 0B1 << 9;
+ static RESILIENCE = 0B1 << 10;
+}
+
+export class Size {
+ static SMALLTEST = 0B1 << 16;
+ static MEDIUMTEST = 0B1 << 17;
+ static LARGETEST = 0B1 << 18;
+}
+
+export class Level {
+ static LEVEL0 = 0B1 << 24;
+ static LEVEL1 = 0B1 << 25;
+ static LEVEL2 = 0B1 << 26;
+ static LEVEL3 = 0B1 << 27;
+ static LEVEL4 = 0B1 << 28;
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/core.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/core.js
new file mode 100644
index 0000000000000000000000000000000000000000..cfcb5f17287208f5e6869b4248faf6c9093002d9
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/core.js
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {SuiteService, SpecService, ExpectService, ReportService} from './service';
+import {ConfigService} from './module/config/configService';
+import {SpecEvent, TaskEvent, SuiteEvent} from './event';
+
+/**
+ * core service for execute testcase.
+ */
+class Core {
+ static getInstance() {
+ if (!this.instance) {
+ this.instance = new Core();
+ }
+ return this.instance;
+ }
+
+ constructor() {
+ this.instance = null;
+ this.services = {
+ suite: {},
+ spec: {},
+ config: {},
+ expect: {},
+ log: {},
+ report: {}
+
+ };
+ this.events = {
+ suite: {},
+ spec: {},
+ task: {}
+ };
+ }
+
+ addService(name, service) {
+ let serviceObj = {};
+ if (!this.services[name]) {
+ this.services[name] = serviceObj;
+ } else {
+ serviceObj = this.services[name];
+ }
+ serviceObj[service.id] = service;
+ }
+
+ getDefaultService(name) {
+ return this.services[name].default;
+ }
+
+ getServices(name) {
+ return this.services[name];
+ }
+
+ registerEvent(serviceName, event) {
+ let eventObj = {};
+ if (!this.events[serviceName]) {
+ this.events[serviceName] = eventObj;
+ } else {
+ eventObj = this.events[serviceName];
+ }
+ eventObj[event.id] = event;
+ }
+
+ unRegisterEvent(serviceName, eventID) {
+ const eventObj = this.events[serviceName];
+ if (eventObj) {
+ delete eventObj[eventID];
+ }
+ }
+
+ subscribeEvent(serviceName, serviceObj) {
+ const eventObj = this.events[serviceName];
+ if (eventObj) {
+ for (const attr in eventObj) {
+ eventObj[attr]['subscribeEvent'](serviceObj);
+ }
+ }
+ }
+
+ async fireEvents(serviceName, eventName) {
+ const eventObj = this.events[serviceName];
+ if (!eventObj) {
+ return;
+ }
+ for (const attr in eventObj) {
+ await eventObj[attr][eventName]();
+ }
+ }
+
+ addToGlobal(apis) {
+ if (typeof globalThis !== 'undefined') {
+ for (let api in apis) {
+ globalThis[api] = apis[api];
+ }
+ }
+ for (const api in apis) {
+ this[api] = apis[api];
+ }
+ }
+
+ init() {
+ this.addService('suite', new SuiteService({id: 'default'}));
+ this.addService('spec', new SpecService({id: 'default'}));
+ this.addService('expect', new ExpectService({id: 'default'}));
+ this.addService('report', new ReportService({id: 'default'}));
+ this.addService('config', new ConfigService({id: 'default'}));
+ this.registerEvent('task', new TaskEvent({id: 'default', coreContext: this}));
+ this.registerEvent('suite', new SuiteEvent({id: 'default', coreContext: this}));
+ this.registerEvent('spec', new SpecEvent({id: 'default', coreContext: this}));
+ this.subscribeEvent('spec', this.getDefaultService('report'));
+ this.subscribeEvent('suite', this.getDefaultService('report'));
+ this.subscribeEvent('task', this.getDefaultService('report'));
+ const context = this;
+ for (const key in this.services) {
+ const serviceObj = this.services[key];
+ for (const serviceID in serviceObj) {
+ const service = serviceObj[serviceID];
+ service.init(context);
+
+ if (typeof service.apis !== 'function') {
+ continue;
+ }
+ const apis = service.apis();
+ if (apis) {
+ this.addToGlobal(apis);
+ }
+ }
+ }
+ }
+
+ execute(abilityDelegator) {
+ const suiteService = this.getDefaultService('suite');
+ const configService = this.getDefaultService('config');
+ if (configService['dryRun'] === 'true') {
+ (async function () {
+ await suiteService.dryRun(abilityDelegator);
+ })();
+ return;
+ }
+ setTimeout(() => {
+ suiteService.execute();
+ }, 10);
+ }
+}
+
+export default Core;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/event.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/event.js
new file mode 100644
index 0000000000000000000000000000000000000000..1333a1c483f9a2aa1c45e133b1d3cbbc7cdb8346
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/event.js
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class SpecEvent {
+ constructor(attr) {
+ this.id = attr.id;
+ this.coreContext = attr.context;
+ this.eventMonitors = [];
+ }
+
+ subscribeEvent(service) {
+ this.eventMonitors.push(service);
+ }
+
+ async specStart() {
+ for (const monitor of this.eventMonitors) {
+ await monitor['specStart']();
+ }
+ }
+
+ async specDone() {
+ for (const monitor of this.eventMonitors) {
+ await monitor['specDone']();
+ }
+ }
+}
+
+class SuiteEvent {
+ constructor(attr) {
+ this.id = attr.id;
+ this.suiteContext = attr.coreContext;
+ this.eventMonitors = [];
+ }
+
+ subscribeEvent(service) {
+ this.eventMonitors.push(service);
+ }
+
+ async suiteStart() {
+ for (const monitor of this.eventMonitors) {
+ await monitor['suiteStart']();
+ }
+ }
+
+ async suiteDone() {
+ for (const monitor of this.eventMonitors) {
+ await monitor['suiteDone']();
+ }
+ }
+}
+
+class TaskEvent {
+ constructor(attr) {
+ this.id = attr.id;
+ this.coreContext = attr.coreContext;
+ this.eventMonitors = [];
+ }
+
+ subscribeEvent(service) {
+ this.eventMonitors.push(service);
+ }
+
+ async taskStart() {
+ for (const monitor of this.eventMonitors) {
+ await monitor['taskStart']();
+ }
+ }
+
+ async taskDone() {
+ for (const monitor of this.eventMonitors) {
+ await monitor['taskDone']();
+ }
+ }
+
+ incorrectFormat() {
+ for (const monitor of this.eventMonitors) {
+ monitor['incorrectFormat']();
+ }
+ }
+}
+
+export {SpecEvent, TaskEvent, SuiteEvent};
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/interface.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/interface.js
new file mode 100644
index 0000000000000000000000000000000000000000..40398c849d55cd76ab64fcba26899b547e2a3c97
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/interface.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Core from './core';
+
+const core = Core.getInstance();
+
+const describe = function (desc, func) {
+ return Reflect.has(core, 'describe') ? core.describe(desc, func) : (desc, func) => { };
+};
+const it = function (desc, filter, func) {
+ return Reflect.has(core, 'it') ? core.it(desc, filter, func) : (desc, filter, func) => { };
+};
+const beforeEach = function (func) {
+ return Reflect.has(core, 'beforeEach') ? core.beforeEach(func) : (func) => { };
+};
+const afterEach = function (func) {
+ return Reflect.has(core, 'afterEach') ? core.afterEach(func) : (func) => { };
+};
+const beforeAll = function (func) {
+ return Reflect.has(core, 'beforeAll') ? core.beforeAll(func) : (func) => { };
+};
+const afterAll = function (func) {
+ return Reflect.has(core, 'afterAll') ? core.afterAll(func) : (func) => { };
+};
+const expect = function (actualValue) {
+ return Reflect.has(core, 'expect') ? core.expect(actualValue) : (actualValue) => { };
+};
+
+export {
+ describe, it, beforeAll, beforeEach, afterEach, afterAll, expect
+};
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/ExpectExtend.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/ExpectExtend.js
new file mode 100644
index 0000000000000000000000000000000000000000..d10d15e6f9955c6d04610101f8766c951ee1a35d
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/ExpectExtend.js
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import assertNull from './assertNull';
+import assertClose from './assertClose';
+import assertContain from './assertContain';
+import assertLess from './assertLess';
+import assertLarger from './assertLarger';
+import assertFail from './assertFail';
+import assertUndefined from './assertUndefined';
+import assertFalse from './assertFalse';
+import assertInstanceOf from './assertInstanceOf';
+import assertThrowError from './assertThrowError';
+import assertLargerOrEqual from './assertLargerOrEqual'
+import assertLessOrEqual from './assertLessOrEqual'
+import assertNaN from './assertNaN'
+import assertNegUnlimited from './assertNegUnlimited'
+import assertPosUnlimited from './assertPosUnlimited'
+import assertDeepEquals from './deepEquals/assertDeepEquals'
+import assertPromiseIsPending from './assertPromiseIsPending';
+import assertPromiseIsRejected from './assertPromiseIsRejected';
+import assertPromiseIsRejectedWith from './assertPromiseIsRejectedWith';
+import assertPromiseIsRejectedWithError from './assertPromiseIsRejectedWithError';
+import assertPromiseIsResolved from './assertPromiseIsResolved';
+import assertPromiseIsResolvedWith from './assertPromiseIsResolvedWith';
+class ExpectExtend {
+ constructor(attr) {
+ this.id = attr.id;
+ this.matchers = {};
+ }
+
+ extendsMatchers() {
+ this.matchers.assertNull = assertNull;
+ this.matchers.assertClose = assertClose;
+ this.matchers.assertContain = assertContain;
+ this.matchers.assertLess = assertLess;
+ this.matchers.assertLarger = assertLarger;
+ this.matchers.assertFail = assertFail;
+ this.matchers.assertUndefined = assertUndefined;
+ this.matchers.assertFalse = assertFalse;
+ this.matchers.assertInstanceOf = assertInstanceOf;
+ this.matchers.assertThrowError = assertThrowError;
+ this.matchers.assertLargerOrEqual = assertLargerOrEqual;
+ this.matchers.assertLessOrEqual = assertLessOrEqual;
+ this.matchers.assertNaN = assertNaN;
+ this.matchers.assertNegUnlimited = assertNegUnlimited;
+ this.matchers.assertPosUnlimited = assertPosUnlimited;
+ this.matchers.assertDeepEquals = assertDeepEquals;
+ this.matchers.assertPromiseIsPending = assertPromiseIsPending;
+ this.matchers.assertPromiseIsRejected = assertPromiseIsRejected;
+ this.matchers.assertPromiseIsRejectedWith = assertPromiseIsRejectedWith;
+ this.matchers.assertPromiseIsRejectedWithError = assertPromiseIsRejectedWithError;
+ this.matchers.assertPromiseIsResolved = assertPromiseIsResolved;
+ this.matchers.assertPromiseIsResolvedWith = assertPromiseIsResolvedWith;
+ }
+
+ init(coreContext) {
+ this.coreContext = coreContext;
+ this.extendsMatchers();
+ const expectService = this.coreContext.getDefaultService('expect');
+ expectService.addMatchers(this.matchers);
+ }
+
+ apis() {
+ return {
+ 'expect': function (actualValue) {
+ return this.coreContext.getDefaultService('expect').expect(actualValue);
+ }
+ };
+ }
+}
+
+export default ExpectExtend;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertClose.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertClose.js
new file mode 100644
index 0000000000000000000000000000000000000000..63635bea5bf1298776de565260e0e0babae56857
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertClose.js
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertClose(actualValue, expected) {
+ console.log('expected:' + expected[0] + ',precision:' + expected[1]);
+ if (actualValue === null && expected[0] === null) {
+ throw new Error('actualValue and expected can not be both null!!!');
+ }
+ let result;
+ let diff = Math.abs(expected[0] - actualValue);
+ let actualAbs = Math.abs(actualValue);
+ if ((actualAbs - 0) === 0) {
+ if ((diff - 0) === 0) {
+ result = true;
+ } else {
+ result = false;
+ }
+ } else if (diff / actualAbs < expected[1]) {
+ result = true;
+ } else {
+ result = false;
+ }
+ return {
+ pass: result,
+ message: '|' + actualValue + ' - ' + expected[0] + '|/' + actualValue + ' is not less than ' + expected[1]
+ };
+}
+
+export default assertClose;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertContain.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertContain.js
new file mode 100644
index 0000000000000000000000000000000000000000..7fba0d9755503e5e926f6c1a4e425e0d1cf47570
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertContain.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertContain(actualValue, expect) {
+ let result = false;
+ if (Object.prototype.toString.call(actualValue).indexOf('Array')) {
+ for (let i in actualValue) {
+ if (actualValue[i] == expect[0]) {
+ result = true;
+ }
+ }
+ }
+ let type = Object.prototype.toString.call(actualValue);
+ if (type === '[object String]') {
+ result = actualValue.indexOf(expect[0]) >= 0;
+ }
+ return {
+ pass: result,
+ message: 'expect false, ' + actualValue + ' do not have ' + expect[0]
+ };
+}
+
+export default assertContain;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertFail.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertFail.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ab4ac5caef712c75c4eac49dfbbb91d33669d9a
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertFail.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertFail() {
+ return {
+ pass: false,
+ message: 'fail '
+ };
+}
+
+export default assertFail;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertFalse.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertFalse.js
new file mode 100644
index 0000000000000000000000000000000000000000..c5008e94f4b2ce13ed35b604811793c76b542347
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertFalse.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertFalse(actualValue) {
+ return {
+ pass: (actualValue) === false,
+ message: 'expect false, actualValue is ' + actualValue
+ };
+}
+
+export default assertFalse;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertInstanceOf.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertInstanceOf.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e11b93f7251c67f5455c5007cd7be268aa53b32
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertInstanceOf.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertInstanceOf(actualValue, expected) {
+ if (Object.prototype.toString.call(actualValue) == '[object ' + expected[0] + ']') {
+ return {
+ pass: true
+ };
+ } else {
+ return {
+ pass: false,
+ message: actualValue + ' is ' + Object.prototype.toString.call(actualValue) + 'not ' + expected[0]
+ };
+ }
+}
+
+export default assertInstanceOf;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLarger.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLarger.js
new file mode 100644
index 0000000000000000000000000000000000000000..a74f4a8cedaf3add9c2dc2d3799081a83198732f
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLarger.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertLarger(actualValue, expected) {
+ return {
+ pass: (actualValue) > expected[0],
+ message: (actualValue) + ' is not larger than ' + expected[0]
+ };
+}
+
+export default assertLarger;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLargerOrEqual.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLargerOrEqual.js
new file mode 100644
index 0000000000000000000000000000000000000000..e847e6c217364b7f69c173c66fb98d10efc45ef1
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLargerOrEqual.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertLargerOrEqual(actualValue, expected) {
+ return {
+ pass: (actualValue) >= expected[0],
+ message: (actualValue) + ' is not larger than ' + expected[0]
+ };
+}
+
+export default assertLargerOrEqual;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLess.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLess.js
new file mode 100644
index 0000000000000000000000000000000000000000..17e84b0abaeb20804048a5a15c19e0603634846d
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLess.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertLess(actualValue, expected) {
+ return {
+ pass: (actualValue) < expected[0],
+ message: (actualValue) + ' is not less than ' + expected[0]
+ };
+}
+
+export default assertLess;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLessOrEqual.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLessOrEqual.js
new file mode 100644
index 0000000000000000000000000000000000000000..f754f97ffa9d24e7852efe2423a1dd35d448af82
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertLessOrEqual.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertLessOrEqual(actualValue, expected) {
+ return {
+ pass: (actualValue) <= expected[0],
+ message: (actualValue) + ' is not less than ' + expected[0]
+ };
+}
+
+export default assertLessOrEqual;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertNaN.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertNaN.js
new file mode 100644
index 0000000000000000000000000000000000000000..8d45d6a93b86c5ed325a68b32ff014835993a58e
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertNaN.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertNaN(actualValue) {
+ return {
+ pass: actualValue !== actualValue,
+ message: 'expect NaN, actualValue is ' + actualValue
+ };
+}
+
+export default assertNaN;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertNegUnlimited.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertNegUnlimited.js
new file mode 100644
index 0000000000000000000000000000000000000000..ceac555afc826e057970e6cfe9c73b322c672aa2
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertNegUnlimited.js
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2022 Huawei Device Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+function assertNegUnlimited(actualValue) {
+ return {
+ pass: actualValue === Number.NEGATIVE_INFINITY,
+ message: 'Expected actualValue not to be -Infinity. actualValue is,' + actualValue
+ };
+}
+
+export default assertNegUnlimited;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertNull.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertNull.js
new file mode 100644
index 0000000000000000000000000000000000000000..53a7bad827323a98d3302a4e7eea679551b459c5
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertNull.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertNull(actualValue) {
+ return {
+ pass: (actualValue) === null,
+ message: 'expect null, actualValue is ' + (actualValue)
+ };
+}
+
+export default assertNull;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPosUnlimited.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPosUnlimited.js
new file mode 100644
index 0000000000000000000000000000000000000000..6e68c0e2b6c499f4dc3dd56c13e9ea1073a3c54c
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPosUnlimited.js
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2022 Huawei Device Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+function assertPosUnlimited(actualValue) {
+ return {
+ pass: actualValue === Number.POSITIVE_INFINITY,
+ message: 'Expected actualValue is POSITIVE_INFINITY. actualValue is,' + actualValue
+ };
+}
+
+export default assertPosUnlimited;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsPending.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsPending.js
new file mode 100644
index 0000000000000000000000000000000000000000..7e2ca2ce14d50c39554fc1157d6d4eb9329d5c39
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsPending.js
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import isPromiseLike from './isPromiseLike';
+
+function assertPromiseIsPending(actualPromise) {
+ if (!isPromiseLike(actualPromise)) {
+ return Promise.reject().then(function () {
+ }, function () {
+ return {pass: false, message: 'Expected not be called on a promise.'};
+ });
+ }
+ const helper = {};
+ return Promise.race([actualPromise, Promise.resolve(helper)]).then(
+ function (got) {
+ return helper === got ? {pass: true, message: 'actualValue is isPending'}
+ : {
+ pass: false,
+ message: 'expect isPending, actualValue is resolve'
+ };
+ },
+ function () {
+ return {
+ pass: false
+ , message: 'expect isPending, actualValue is reject'
+ };
+ });
+}
+
+export default assertPromiseIsPending;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsRejected.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsRejected.js
new file mode 100644
index 0000000000000000000000000000000000000000..eb8e65c7d70d5750a9ccebb55c2cf5049cf144fc
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsRejected.js
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import isPromiseLike from './isPromiseLike';
+
+function assertPromiseIsRejected(actualPromise) {
+ if (!isPromiseLike(actualPromise)) {
+ return Promise.reject().then(function () {
+ }, function () {
+ return {pass: false, message: 'Expected not be called on a promise.'};
+ });
+ }
+ const helper = {};
+ return Promise.race([actualPromise, Promise.resolve(helper)]).then(
+ function (got) {
+ return {
+ pass: false,
+ message: 'expect isRejected, but actualValue is '
+ + (helper === got ? 'isPending' : 'resolve')
+ };
+ },
+ function () {
+ return {pass: true, message: 'actualValue is isRejected'};
+ }
+ );
+}
+
+export default assertPromiseIsRejected;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsRejectedWith.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsRejectedWith.js
new file mode 100644
index 0000000000000000000000000000000000000000..48eaf7859279a70ea2ad85509296b5da1c7b69f9
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsRejectedWith.js
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import isPromiseLike from './isPromiseLike';
+
+function assertPromiseIsRejectedWith(actualPromise, expectedValue) {
+
+ if (!isPromiseLike(actualPromise)) {
+ return Promise.reject().then(function () {
+ }, function () {
+ return {pass: false, message: 'Expected not be called on a promise.'};
+ });
+ }
+
+ function tips(passed) {
+ return ('Expected a promise ' + (passed ? 'not ' : '') +
+ 'to be rejected with ' + JSON.stringify(expectedValue[0]));
+ }
+
+ const helper = {};
+ return Promise.race([actualPromise, Promise.resolve(helper)]).then(
+ function (got) {
+ return {
+ pass: false,
+ message: tips(false) + ' but actualValue is '
+ + (helper === got ? 'isPending' : 'resolve')
+ };
+ },
+ function (actualValue) {
+ if (JSON.stringify(actualValue) == JSON.stringify(expectedValue[0])) {
+ return {
+ pass: true,
+ message: 'actualValue was rejected with ' + JSON.stringify(actualValue) + '.'
+ };
+ } else {
+ return {
+ pass: false,
+ message: tips(false) + ' but it was rejected with ' + JSON.stringify(actualValue) + '.'
+ };
+ }
+ }
+ );
+}
+
+export default assertPromiseIsRejectedWith;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsRejectedWithError.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsRejectedWithError.js
new file mode 100644
index 0000000000000000000000000000000000000000..334a3d397fec0a0f79b9aa1bf92a9622b580351f
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsRejectedWithError.js
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import isPromiseLike from './isPromiseLike';
+
+function assertPromiseIsRejectedWithError(actualPromise, expectedValue) {
+ if (!isPromiseLike(actualPromise)) {
+ return Promise.reject().then(function () {
+ }, function () {
+ return {pass: false, message: 'Expected not be called on a promise.'};
+ });
+ }
+ const helper = {};
+ return Promise.race([actualPromise, Promise.resolve(helper)]).then(
+ function (got) {
+ return {
+ pass: false,
+ message: 'Expected a promise to be rejected but actualValue is '
+ + (helper === got ? 'isPending' : 'resolve')
+ };
+ },
+ function (actualValue) {
+ return matchError(actualValue, expectedValue);
+ }
+ );
+
+}
+
+function matchError(actualValue, expectedValue) {
+ if (expectedValue.length == 1 && typeof expectedValue[0] === 'function') {
+ if (expectedValue[0].name === actualValue.__proto__.name) {
+ return {pass: true, message: 'actual error type is ' + actualValue.name + '.'};
+ }
+ return {
+ pass: false,
+ message: 'except error type is ' + expectedValue[0].name + ',but actual is ' + actualValue.name + '.'
+ };
+ }
+
+ if (expectedValue.length == 1 && typeof expectedValue[0] === 'string') {
+ if (expectedValue[0] === actualValue.message) {
+ return {pass: true, message: 'actual error message is ' + actualValue.message + '.'};
+ }
+ return {
+ pass: false,
+ message: 'except error message ' + expectedValue[0] + ',but actual is ' + actualValue.message + '.'
+ };
+ }
+
+ if (expectedValue.length == 1) {
+ return {
+ pass: false,
+ message: 'When only one parameter, it ' +
+ 'should be error type or error message.'
+ };
+ }
+
+ if (expectedValue.length == 2 && typeof expectedValue[0] === 'function' && expectedValue[0].name === actualValue.name) {
+ if (typeof expectedValue[1] === 'string' && actualValue.message === expectedValue[1]) {
+ return {pass: true, message: 'actual error message is ' + actualValue.message + '.'};
+ } else {
+ return {
+ pass: false,
+ message: 'except error message is ' + expectedValue[1] + ',but actual is ' + actualValue.message + '.'
+ };
+ }
+ }
+
+ if (expectedValue.length == 2 && typeof expectedValue[0] === 'function' && expectedValue[0].name !== actualValue.name) {
+ if (typeof expectedValue[1] === 'string' && actualValue.message === expectedValue[1]) {
+ return {
+ pass: false,
+ message: 'except error type is ' + expectedValue[0].name + ',but actual is ' + actualValue.name + '.'
+ };
+ } else {
+ return {
+ pass: false,
+ message: 'except error type and message are incorrect.'
+ };
+ }
+ }
+
+ if (expectedValue.length > 2) {
+ return {
+ pass: false,
+ message: 'Up to two parameters are supported.'
+ };
+ }
+}
+
+export default assertPromiseIsRejectedWithError;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsResolved.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsResolved.js
new file mode 100644
index 0000000000000000000000000000000000000000..855426ca79e5002428e53d4fcb5f843cdf7119f7
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsResolved.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import isPromiseLike from './isPromiseLike';
+
+function assertPromiseIsResolved(actualPromise) {
+ if (!isPromiseLike(actualPromise)) {
+ return Promise.reject().then(function () {
+ }, function () {
+ return {pass: false, message: 'Expected not be called on a promise.'};
+ });
+ }
+
+ const helper = {};
+ return Promise.race([actualPromise, Promise.resolve(helper)]).then(
+ function (got) {
+ return helper === got ? {
+ pass: false,
+ message: 'expect resolve, actualValue is isPending'
+ }
+ : {pass: true, message: 'actualValue is isResolved'};
+ },
+ function (rej) {
+ return {
+ pass: false,
+ message: 'Expected a promise to be resolved but it was ' +
+ 'rejected with ' + JSON.stringify(rej) + '.'
+ };
+ }
+ );
+}
+
+export default assertPromiseIsResolved;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsResolvedWith.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsResolvedWith.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5eb01e32491b281a1e1d650a307723253a61e39
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertPromiseIsResolvedWith.js
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import isPromiseLike from './isPromiseLike';
+
+function assertPromiseIsResolvedWith(actualPromise, expectedValue) {
+ if (!isPromiseLike(actualPromise)) {
+ return Promise.reject().then(function () {
+ }, function () {
+ return {pass: false, message: 'Expected not be called on a promise.'};
+ });
+ }
+
+ function tips(passed) {
+ return (
+ 'Expected a promise ' + (passed ? 'not ' : '') +
+ 'to be resolved with ' + JSON.stringify(expectedValue[0]));
+ }
+
+ const helper = {};
+ return Promise.race([actualPromise, Promise.resolve(helper)]).then(
+ function (got) {
+ if (helper === got) {
+ return {pass: false, message: 'expect resolve, actualValue is isPending'};
+ }
+ if (JSON.stringify(got) == JSON.stringify(expectedValue[0])) {
+ return {
+ pass: true,
+ message: 'actualValue was resolved with ' + JSON.stringify(got) + '.'
+ };
+ }
+ return {
+ pass: false,
+ message: tips(false) + ' but it was resolved with ' +
+ JSON.stringify(got) + '.'
+ };
+ },
+ function (rej) {
+ return {
+ pass: false,
+ message: tips(false) + ' but it was rejected with ' + JSON.stringify(rej) + '.'
+ };
+ }
+ );
+}
+
+export default assertPromiseIsResolvedWith;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertThrowError.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertThrowError.js
new file mode 100644
index 0000000000000000000000000000000000000000..749cab0daee3f156909f60c9375146c23d7aa322
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertThrowError.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertThrowError(actualValue, expected) {
+ let result = false;
+ let err;
+ if (typeof actualValue !== 'function') {
+ throw new Error('actualValue is not a function');
+ }
+ try {
+ actualValue();
+ return {
+ pass: result,
+ message: ' An error is not thrown while it is expected!'
+ };
+ } catch (e) {
+ err = e;
+ }
+
+ if (err instanceof Error) {
+ console.log(err.message);
+ if (err.message == expected[0]) {
+ result = true;
+ }
+ }
+ return {
+ pass: result,
+ message: 'expected throw failed , ' + err.message + ' is not ' + expected[0]
+ };
+}
+
+export default assertThrowError;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertUndefined.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertUndefined.js
new file mode 100644
index 0000000000000000000000000000000000000000..61f092d715dd1630297518b59ff13ef0940991e1
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/assertUndefined.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function assertUndefined(actualValue) {
+ return {
+ pass: undefined === (actualValue),
+ message: 'expect Undefined, actualValue is ' + (actualValue)
+ };
+}
+
+export default assertUndefined;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/deepEquals/DeepTypeUtils.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/deepEquals/DeepTypeUtils.js
new file mode 100644
index 0000000000000000000000000000000000000000..b0be6674ee3474b08aff2f16b0a3c161aa8683df
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/deepEquals/DeepTypeUtils.js
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class DeepTypeUtils {
+ static getType_(value) {
+ return Object.prototype.toString.apply(value);
+ }
+ static isA_(typeName, value) {
+ return this.getType_(value) === '[object ' + typeName + ']';
+ }
+ static isAsymmetricEqualityTester_(obj) {
+ return obj ? this.isA_('Function', obj.asymmetricMatch) : false;
+ }
+
+ /**
+ * 是否是function
+ * @param value
+ */
+ static isFunction_(value) {
+ return this.isA_('Function', value);
+ }
+
+ /**
+ * 是否是undefined
+ * @param obj
+ */
+ static isUndefined(obj) {
+ return obj === void 0;
+ }
+
+ /**
+ * 是否是Node
+ * @param obj
+ */
+ static isDomNode(obj) {
+ return obj !== null &&
+ typeof obj === 'object' &&
+ typeof obj.nodeType === 'number' &&
+ typeof obj.nodeName === 'string';
+ }
+
+ /**
+ * 是否是promise对象
+ * @param obj
+ */
+ static isPromise (obj) {
+ return !!obj && obj.constructor === Promise;
+ };
+ /**
+ * 是否是map对象
+ * @param obj
+ */
+ static isMap(obj) {
+ return (
+ obj !== null &&
+ typeof obj !== 'undefined' &&
+ obj.constructor === Map
+ );
+ }
+
+ /**
+ * 是否是set对象
+ * @param obj 对象
+ */
+ static isSet(obj) {
+ return (
+ obj !== null &&
+ typeof obj !== 'undefined' &&
+ obj.constructor === Set
+ );
+ }
+
+ /**
+ * 对象是否有key属性
+ * @param obj 对象
+ * @param key 对象属性名称
+ */
+ static has(obj, key) {
+ return Object.prototype.hasOwnProperty.call(obj, key);
+ }
+
+ /**
+ * 获取对象的自有属性
+ * @param obj 对象
+ * @param isArray 是否是数组,[object Array]
+ */
+ static keys(obj, isArray) {
+ const extraKeys = [];
+ // 获取对象所有属性
+ const allKeys = this.getAllKeys(obj);
+ if (!isArray) {
+ return allKeys;
+ }
+ if (allKeys.length === 0) {
+ return allKeys;
+ }
+ for (const k of allKeys) {
+ if (typeof k === 'symbol' || !/^[0-9]+$/.test(k)) {
+ extraKeys.push(k);
+ }
+ }
+ return extraKeys;
+ }
+
+ /**
+ * 获取obj对象的所有属性
+ * @param obj obj对象
+ */
+ static getAllKeys(obj) {
+ const keys = [];
+ for (let key in obj) {
+ if(this.has(obj, key)) {
+ keys.push(key);
+ }
+ }
+ const symbols = Object.getOwnPropertySymbols(obj);
+ for (const sym of symbols) {
+ if (obj.propertyIsEnumerable(sym)) {
+ keys.push(sym);
+ }
+ }
+ return keys;
+ }
+
+}
+export default DeepTypeUtils;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/deepEquals/assertDeepEquals.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/deepEquals/assertDeepEquals.js
new file mode 100644
index 0000000000000000000000000000000000000000..4d991b4878fae2768bc7af074e275706d79e6f4d
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/deepEquals/assertDeepEquals.js
@@ -0,0 +1,311 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DeepTypeUtils from './DeepTypeUtils'
+function assertDeepEquals(actualValue, expected) {
+ console.log('actualValue:' + actualValue + ',expected:' + expected[0]);
+ let result = eq(actualValue, expected[0],[], [])
+ let msg = logMsg(actualValue, expected[0]);
+ return {
+ pass: result,
+ message: msg
+ };
+}
+
+/**
+ * 获取失败显示日志
+ * @param actualValue 实际对象
+ * @param expected 期待比较对象
+ */
+function logMsg(actualValue, expected) {
+ // 获取a的对象名称
+ const aClassName = Object.prototype.toString.call(actualValue);
+ const bClassName = Object.prototype.toString.call(expected);
+ let actualMsg;
+ let expectMsg;
+ if(aClassName == "[object Function]") {
+ actualMsg = "actualValue Function"
+ }else if(aClassName == "[object Promise]") {
+ actualMsg = "actualValue Promise"
+ }else if(aClassName == "[object Set]" || aClassName == "[object Map]") {
+ actualMsg = JSON.stringify(Array.from(actualValue));;
+ }else if(aClassName == "[object RegExp]") {
+ actualMsg = JSON.stringify(actualValue.source.replace("\\",""));;
+ }
+ else{
+ actualMsg = JSON.stringify(actualValue);
+ }
+ if(bClassName == "[object Function]") {
+ expectMsg = "expected Function"
+ }else if(bClassName == "[object Promise]") {
+ expectMsg = "expected Promise"
+ }else if(aClassName == "[object Set]" || bClassName == "[object Map]") {
+ expectMsg = JSON.stringify(Array.from(expected));
+ }else if(aClassName == "[object RegExp]") {
+ expectMsg = JSON.stringify(expected.source.replace("\\",""));;
+ }
+ else{
+ expectMsg = JSON.stringify(expected);
+ }
+ return actualMsg + " is not deep equal " + expectMsg;
+}
+
+function eq(a, b, aStack, bStack) {
+ let result = true;
+ console.log('a is:' + a + ',b is:' + b);
+ const asymmetricResult = asymmetricMatch_(a,b);
+ if (!DeepTypeUtils.isUndefined(asymmetricResult)) {
+ return asymmetricResult;
+ }
+
+ if (a instanceof Error && b instanceof Error) {
+ result = a.message == b.message;
+ return result;
+ }
+
+ if (a === b) {
+ result = a !== 0 || 1 / a == 1 / b;
+ return result;
+ }
+
+ if (a === null || b === null) {
+ result = a === b;
+ return result;
+ }
+ // 获取a的对象名称
+ const aClassName = Object.prototype.toString.call(a);
+ const bClassName = Object.prototype.toString.call(b);
+ console.log('aClassName is:' + aClassName);
+ console.log('bClassName is:' + bClassName);
+ // 不同类型不同对象
+ if (aClassName != bClassName) {
+ return false;
+ }
+ // 俩个string对象
+ if(aClassName === '[object String]') {
+ result = a == String(b);
+ return result;
+ }
+ // 俩个Number对象
+ if(aClassName === '[object Number]') {
+ result = a != +a ? b != +b : a === 0 && b === 0 ? 1 / a == 1 / b : a == +b;
+ return result;
+ }
+
+ if(aClassName === '[object Date]' || aClassName === '[object Boolean]') {
+ result = +a == +b;
+ return result;
+ }
+
+ // 数组
+ if(aClassName === '[object ArrayBuffer]') {
+ return eq(new Uint8Array(a), new Uint8Array(b), aStack, bStack);
+ }
+
+ // 正则表达式
+ if(aClassName === '[object RegExp]') {
+ return (
+ a.source == b.source &&
+ a.global == b.global &&
+ a.multiline == b.multiline &&
+ a.ignoreCase == b.ignoreCase
+ );
+ }
+
+ if (typeof a != 'object' || typeof b != 'object') {
+ return false;
+ }
+
+ const aIsDomNode = DeepTypeUtils.isDomNode(a);
+ const bIsDomNode = DeepTypeUtils.isDomNode(b);
+ if (aIsDomNode && bIsDomNode) {
+ // At first try to use DOM3 method isEqualNode
+ result = a.isEqualNode(b);
+ return result;
+ }
+ if (aIsDomNode || bIsDomNode) {
+ return false;
+ }
+ const aIsPromise = DeepTypeUtils.isPromise(a);
+ const bIsPromise = DeepTypeUtils.isPromise(b);
+ if (aIsPromise && bIsPromise) {
+ return a === b;
+ }
+ let length = aStack.length;
+ while (length--) {
+ if (aStack[length] == a) {
+ return bStack[length] == b;
+ }
+ }
+ aStack.push(a);
+ bStack.push(b);
+ let size = 0;
+
+ // 都是数组
+ if(aClassName == '[object Array]') {
+ const aLength = a.length;
+ const bLength = b.length;
+ if (aLength !== bLength) {
+ // 数组长度不同,不是同一个对象
+ return false;
+ }
+ for (let i = 0; i < aLength || i < bLength; i++) {
+ // 递归每一个元素是否相同
+ result = eq(i < aLength ? a[i] : void 0, i < bLength ? b[i] : void 0, aStack, bStack) && result;
+ }
+ if (!result) {
+ return false;
+ }
+ } else if(DeepTypeUtils.isMap(a) && DeepTypeUtils.isMap(b)) {
+ if (a.size != b.size) {
+ return false;
+ }
+ const keysA = [];
+ const keysB = [];
+ a.forEach(function(valueA, keyA) {
+ keysA.push(keyA);
+ });
+ b.forEach(function(valueB, keyB) {
+ keysB.push(keyB);
+ });
+ const mapKeys = [keysA, keysB];
+ const cmpKeys = [keysB, keysA];
+ for (let i = 0; result && i < mapKeys.length; i++) {
+ const mapIter = mapKeys[i];
+ const cmpIter = cmpKeys[i];
+
+ for (let j = 0; result && j < mapIter.length; j++) {
+ const mapKey = mapIter[j];
+ const cmpKey = cmpIter[j];
+ const mapValueA = a.get(mapKey);
+ let mapValueB;
+ if (
+ DeepTypeUtils.isAsymmetricEqualityTester_(mapKey) ||
+ (DeepTypeUtils.isAsymmetricEqualityTester_(cmpKey) &&
+ eq(mapKey, cmpKey))
+ ) {
+ mapValueB = b.get(cmpKey);
+ } else {
+ mapValueB = b.get(mapKey);
+ }
+ result = eq(mapValueA, mapValueB, aStack, bStack);
+ }
+ }
+ if (!result) {
+ return false;
+ }
+ } else if(DeepTypeUtils.isSet(a) && DeepTypeUtils.isSet(b)) {
+ if (a.size != b.size) {
+ return false;
+ }
+ const valuesA = [];
+ a.forEach(function(valueA) {
+ valuesA.push(valueA);
+ });
+ const valuesB = [];
+ b.forEach(function(valueB) {
+ valuesB.push(valueB);
+ });
+ const setPairs = [[valuesA, valuesB], [valuesB, valuesA]];
+ const stackPairs = [[aStack, bStack], [bStack, aStack]];
+ for (let i = 0; result && i < setPairs.length; i++) {
+ const baseValues = setPairs[i][0];
+ const otherValues = setPairs[i][1];
+ const baseStack = stackPairs[i][0];
+ const otherStack = stackPairs[i][1];
+ for (const baseValue of baseValues) {
+ let found = false;
+ for (let j = 0; !found && j < otherValues.length; j++) {
+ const otherValue = otherValues[j];
+ const prevStackSize = baseStack.length;
+ // 深度比较对象
+ found = eq(baseValue, otherValue, baseStack, otherStack);
+ if (!found && prevStackSize !== baseStack.length) {
+ baseStack.splice(prevStackSize);
+ otherStack.splice(prevStackSize);
+ }
+ }
+ result = result && found;
+ }
+ }
+ if (!result) {
+ return false;
+ }
+ } else {
+ const aCtor = a.constructor,
+ bCtor = b.constructor;
+ if (
+ aCtor !== bCtor &&
+ DeepTypeUtils.isFunction_(aCtor) &&
+ DeepTypeUtils.isFunction_(bCtor) &&
+ a instanceof aCtor &&
+ b instanceof bCtor &&
+ !(aCtor instanceof aCtor && bCtor instanceof bCtor)
+ ) {
+ return false;
+ }
+ }
+
+ // 获取对象所有的属性集合
+ const aKeys = DeepTypeUtils.keys(a, aClassName == '[object Array]');
+ size = aKeys.length;
+
+ // 俩个对象属性长度不一致, 俩对象不相同
+ if (DeepTypeUtils.keys(b, bClassName == '[object Array]').length !== size) {
+ return false;
+ }
+
+ // 俩对象属性数量相同, 递归比较每个属性值得值
+ for (const key of aKeys) {
+ console.log('key is:' + key);
+ // b 没有 key 属性
+ if(!DeepTypeUtils.has(b, key)) {
+ result = false;
+ continue;
+ }
+ if (!eq(a[key], b[key], aStack, bStack)) {
+ result = false;
+ }
+ }
+ if (!result) {
+ return false;
+ }
+ aStack.pop();
+ bStack.pop();
+ return result;
+}
+
+function asymmetricMatch_(a, b) {
+ const asymmetricA = DeepTypeUtils.isAsymmetricEqualityTester_(a);
+ const asymmetricB = DeepTypeUtils.isAsymmetricEqualityTester_(b);
+
+ if (asymmetricA === asymmetricB) {
+ return undefined;
+ }
+
+}
+
+/**
+ * 获取对象的自有属性
+ *
+ * @param obj 对象
+ * @param isArray 是否是一个数组
+ */
+function keys(obj, isArray) {
+ const keys = [];
+
+}
+
+export default assertDeepEquals;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/isPromiseLike.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/isPromiseLike.js
new file mode 100644
index 0000000000000000000000000000000000000000..015ab19a2a0c4872d7cb490b61f8e1dd6a8ac90b
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/assert/isPromiseLike.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+function isPromiseLike(obj) {
+ return !!obj && isFunction_(obj.then);
+}
+
+function isFunction_(value) {
+ return isA_('Function', value);
+}
+
+function isA_(typeName, value) {
+ return getType_(value) === '[object ' + typeName + ']';
+}
+
+function getType_(value) {
+ return Object.prototype.toString.apply(value);
+}
+
+export default isPromiseLike;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/config/DataDriver.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/config/DataDriver.js
new file mode 100644
index 0000000000000000000000000000000000000000..639dffc9cdb912f1f33a6ccb61868c9ed7c695bf
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/config/DataDriver.js
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+const SUITES_KEY = 'suites';
+const SPECS_KEY = 'items';
+const DESCRIBE_KEY = 'describe';
+const IT_KEY = 'it';
+const PARAMS_KEY = 'params';
+const STRESS_KEY = 'stress';
+
+class ObjectUtils {
+ static get(object, name, defaultValue) {
+ let result = defaultValue;
+ for (const key in object) {
+ if (key === name) {
+ return object[key];
+ }
+ }
+ return result;
+ }
+
+ static has(object, key) {
+ return Object.prototype.hasOwnProperty.call(object, key);
+ }
+}
+
+class DataDriver {
+ constructor(attr) {
+ this.id = 'dataDriver';
+ this.data = attr.data || {};
+ }
+
+ init(coreContext) {
+ this.coreContext = coreContext;
+ this.suiteService = this.coreContext.getDefaultService('suite');
+ this.specService = this.coreContext.getDefaultService('spec');
+ }
+
+ getSpecParams() {
+ let specParams = [];
+ let suiteDesc = this.suiteService.getCurrentRunningSuite().description;
+ let specDesc = this.specService.getCurrentRunningSpec().description;
+ let suites = ObjectUtils.get(this.data, SUITES_KEY, []);
+ for (const suiteItem of suites) {
+ let describeValue = ObjectUtils.get(suiteItem, DESCRIBE_KEY, '');
+ if (ObjectUtils.has(suiteItem, DESCRIBE_KEY) && (typeof describeValue === 'object') && describeValue.constructor === Array && describeValue.includes(suiteDesc)) {
+ let specs = ObjectUtils.get(suiteItem, SPECS_KEY, []);
+ for (const specItem of specs) {
+ if (ObjectUtils.has(specItem, IT_KEY) && ObjectUtils.get(specItem, IT_KEY) === specDesc) {
+ return ObjectUtils.get(specItem, PARAMS_KEY, specParams);
+ }
+ }
+ }
+ }
+ return specParams;
+ }
+
+ getSuiteParams() {
+ let suiteParams = {};
+ let suiteDesc = this.suiteService.getCurrentRunningSuite().description;
+ let suites = ObjectUtils.get(this.data, SUITES_KEY, []);
+ for (const suiteItem of suites) {
+ let describeValue = ObjectUtils.get(suiteItem, DESCRIBE_KEY, []);
+ if (ObjectUtils.has(suiteItem, DESCRIBE_KEY) && (typeof describeValue === 'object') && describeValue.constructor === Array && describeValue.includes(suiteDesc)) {
+ suiteParams = Object.assign({}, suiteParams, ObjectUtils.get(suiteItem, PARAMS_KEY, suiteParams));
+ }
+ }
+ return suiteParams;
+ }
+
+ getSpecStress(specDesc) {
+ let stress = 1;
+ let suiteDesc = this.suiteService.getCurrentRunningSuite().description;
+ let suites = ObjectUtils.get(this.data, SUITES_KEY, []);
+ for (const suiteItem of suites) {
+ let describeValue = ObjectUtils.get(suiteItem, DESCRIBE_KEY, '');
+ if (ObjectUtils.has(suiteItem, DESCRIBE_KEY) && (typeof describeValue === 'object') && describeValue.constructor === Array && describeValue.includes(suiteDesc)) {
+ let specs = ObjectUtils.get(suiteItem, SPECS_KEY, []);
+ for (const specItem of specs) {
+ if (ObjectUtils.has(specItem, IT_KEY) && ObjectUtils.get(specItem, IT_KEY) === specDesc) {
+ let tempStress = ObjectUtils.get(specItem, STRESS_KEY, stress);
+ return (Number.isInteger(tempStress) && tempStress >= 1) ? tempStress : stress;
+ }
+ }
+ }
+ }
+ return stress;
+ }
+
+ getSuiteStress(suiteDesc) {
+ let stress = 1;
+ let suites = ObjectUtils.get(this.data, SUITES_KEY, []);
+ for (const suiteItem of suites) {
+ let describeValue = ObjectUtils.get(suiteItem, DESCRIBE_KEY, []);
+ if (ObjectUtils.has(suiteItem, DESCRIBE_KEY) && (typeof describeValue === 'object') && describeValue.constructor === Array && describeValue.includes(suiteDesc)) {
+ let tempStress = ObjectUtils.get(suiteItem, STRESS_KEY, stress);
+ return (Number.isInteger(tempStress) && tempStress >= 1) ? tempStress : stress;
+ }
+ }
+ return stress;
+ }
+}
+
+export default DataDriver;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/config/Filter.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/config/Filter.js
new file mode 100644
index 0000000000000000000000000000000000000000..0ca3b4f412353ad0e9fa70bcfe775c905b5e02a9
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/config/Filter.js
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class ClassFilter {
+ constructor(suiteName, itName, params) {
+ this.suiteName = suiteName;
+ this.itName = itName;
+ this.params = params;
+ }
+
+ filterSuite() {
+ return !this.params.split(',').map(item => item.split('#')[0]).map(item => item == this.suiteName).reduce((pre, cur) => pre || cur, false);
+ }
+
+ filterIt() {
+ let classArray = this.params.split(',') || [];
+ let suiteFilterResult = classArray.filter(item => !item.includes('#')).map(item => item == this.suiteName).reduce((pre, cur) => pre || cur, false);
+ let itFilterResult = classArray.filter(item => item.includes('#')).map(item => item == (this.suiteName + '#' + this.itName)).reduce((pre, cur) => pre || cur, false);
+ return !(suiteFilterResult || itFilterResult);
+ }
+}
+
+class NotClassFilter {
+ constructor(suiteName, itName, params) {
+ this.suiteName = suiteName;
+ this.itName = itName;
+ this.params = params;
+ }
+
+ filterSuite() {
+ return this.params.split(',').map(item => item == this.suiteName).reduce((pre, cur) => pre || cur, false);
+ }
+
+ filterIt() {
+ return this.params.split(',').some(item => item == (this.suiteName + '#' + this.itName));
+ }
+}
+
+class SuiteAndItNameFilter {
+ constructor(suiteName, itName, params) {
+ this.suiteName = suiteName;
+ this.itName = itName;
+ this.params = params;
+ }
+
+ filterSuite() {
+ return !this.params.split(',').map(item => item == this.suiteName).reduce((pre, cur) => pre || cur, false);
+ }
+
+ filterIt() {
+ return !this.params.split(',').map(item => item == this.itName).reduce((pre, cur) => pre || cur, false);
+ }
+}
+
+
+class TestTypesFilter {
+ constructor(suiteName, itName, fi, params) {
+ this.suiteName = suiteName;
+ this.itName = itName;
+ this.params = params;
+ this.fi = fi;
+ }
+
+ filterIt() {
+ return !((this.params === (this.fi & this.params)) || this.fi === 0);
+ }
+}
+
+export {ClassFilter, NotClassFilter, SuiteAndItNameFilter, TestTypesFilter};
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/config/configService.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/config/configService.js
new file mode 100644
index 0000000000000000000000000000000000000000..745f137e3d48ff86bbd910f6639affe56a773654
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/config/configService.js
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {ClassFilter, NotClassFilter, SuiteAndItNameFilter, TestTypesFilter} from './Filter';
+const STRESS_RULE = /^[1-9]\d*$/;
+
+class ConfigService {
+ constructor(attr) {
+ this.id = attr.id;
+ this.supportAsync = false;
+ this.random = false;
+ this.filterValid = [];
+ this.filter = 0;
+ this.flag = false;
+ this.suite = null;
+ this.itName = null;
+ this.testType = null;
+ this.level = null;
+ this.size = null;
+ this.class = null;
+ this.notClass = null;
+ this.timeout = null;
+ // 遇错即停模式配置
+ this.breakOnError = false;
+ // 压力测试配置
+ this.stress = null;
+ }
+
+ init(coreContext) {
+ this.coreContext = coreContext;
+ }
+
+ isNormalInteger(str) {
+ const n = Math.floor(Number(str));
+ return n !== Infinity && String(n) === String(str) && n >= 0;
+ }
+
+ getStress() {
+ if (this.stress === undefined || this.stress === '' || this.stress === null) {
+ return 1;
+ }
+ return !this.stress.match(STRESS_RULE) ? 1 : Number.parseInt(this.stress);
+ }
+
+ basicParamValidCheck(params) {
+ let size = params.size;
+ if (size !== undefined && size !== '' && size !== null) {
+ let sizeArray = ['small', 'medium', 'large'];
+ if (sizeArray.indexOf(size) === -1) {
+ this.filterValid.push('size:' + size);
+ }
+ }
+ let level = params.level;
+ if (level !== undefined && level !== '' && level !== null) {
+ let levelArray = ['0', '1', '2', '3', '4'];
+ if (levelArray.indexOf(level) === -1) {
+ this.filterValid.push('level:' + level);
+ }
+ }
+ let testType = params.testType;
+ if (testType !== undefined && testType !== '' && testType !== null) {
+ let testTypeArray = ['function', 'performance', 'power', 'reliability', 'security',
+ 'global', 'compatibility', 'user', 'standard', 'safety', 'resilience'];
+ if (testTypeArray.indexOf(testType) === -1) {
+ this.filterValid.push('testType:' + testType);
+ }
+ }
+ }
+
+ filterParamValidCheck(params) {
+ let timeout = params.timeout;
+ if (timeout !== undefined && timeout !== '' && timeout !== null) {
+ if (!this.isNormalInteger(timeout)) {
+ this.filterValid.push('timeout:' + timeout);
+ }
+ }
+
+ let paramKeys = ['dryRun', 'random', 'breakOnError', 'coverage'];
+ for (const key of paramKeys) {
+ if (params[key] !== undefined && params[key] !== 'true' && params[key] !== 'false') {
+ this.filterValid.push(`${key}:${params[key]}`);
+ }
+ }
+
+ // 压力测试参数验证,正整数
+ if (params.stress !== undefined && params.stress !== '' && params.stress !== null) {
+ if (!params.stress.match(STRESS_RULE)) {
+ this.filterValid.push('stress:' + params.stress);
+ }
+ }
+
+ let nameRule = /^[A-Za-z]{1}[\w#,.]*$/;
+ let paramClassKeys = ['class', 'notClass'];
+ for (const key of paramClassKeys) {
+ if (params[key] !== undefined && params[key] !== '' && params[key] !== null) {
+ let classArray = params[key].split(',');
+ classArray.forEach(item => !item.match(nameRule) ? this.filterValid.push(`${key}:${params[key]}`) : null);
+ }
+ }
+ }
+
+ setConfig(params) {
+ this.basicParamValidCheck(params);
+ this.filterParamValidCheck(params);
+ try {
+ this.class = params.class;
+ this.notClass = params.notClass;
+ this.flag = params.flag || {flag: false};
+ this.suite = params.suite;
+ this.itName = params.itName;
+ this.filter = params.filter;
+ this.testType = params.testType;
+ this.level = params.level;
+ this.size = params.size;
+ this.timeout = params.timeout;
+ this.dryRun = params.dryRun;
+ this.breakOnError = params.breakOnError;
+ this.random = params.random === 'true' ? true : false;
+ this.stress = params.stress;
+ this.coverage = params.coverage;
+ this.filterParam = {
+ testType: {
+ 'function': 1,
+ 'performance': 1 << 1,
+ 'power': 1 << 2,
+ 'reliability': 1 << 3,
+ 'security': 1 << 4,
+ 'global': 1 << 5,
+ 'compatibility': 1 << 6,
+ 'user': 1 << 7,
+ 'standard': 1 << 8,
+ 'safety': 1 << 9,
+ 'resilience': 1 << 10,
+ },
+ level: {
+ '0': 1 << 24,
+ '1': 1 << 25,
+ '2': 1 << 26,
+ '3': 1 << 27,
+ '4': 1 << 28,
+ },
+ size: {
+ 'small': 1 << 16,
+ 'medium': 1 << 17,
+ 'large': 1 << 18,
+ }
+ };
+ this.parseParams();
+ } catch (err) {
+ console.info('setConfig error: ' + err.message);
+ }
+ }
+
+ parseParams() {
+ if (this.filter != null) {
+ return;
+ }
+ let testTypeFilter = 0;
+ let sizeFilter = 0;
+ let levelFilter = 0;
+ if (this.testType != null) {
+ testTypeFilter = this.testType.split(',')
+ .map(item => this.filterParam.testType[item] || 0)
+ .reduce((pre, cur) => pre | cur, 0);
+ }
+ if (this.level != null) {
+ levelFilter = this.level.split(',')
+ .map(item => this.filterParam.level[item] || 0)
+ .reduce((pre, cur) => pre | cur, 0);
+ }
+ if (this.size != null) {
+ sizeFilter = this.size.split(',')
+ .map(item => this.filterParam.size[item] || 0)
+ .reduce((pre, cur) => pre | cur, 0);
+ }
+ this.filter = testTypeFilter | sizeFilter | levelFilter;
+ console.info('filter params:' + this.filter);
+ }
+
+ isCurrentSuite(description) {
+ if (this.suite !== undefined && this.suite !== '' && this.suite !== null) {
+ let suiteArray = this.suite.split(',');
+ return suiteArray.indexOf(description) !== -1;
+ }
+ return false;
+ }
+
+ filterSuite(currentSuiteName) {
+ let filterArray = [];
+ if (this.suite !== undefined && this.suite !== '' && this.suite !== null) {
+ filterArray.push(new SuiteAndItNameFilter(currentSuiteName, '', this.suite));
+ }
+ if (this.class !== undefined && this.class !== '' && this.class !== null) {
+ filterArray.push(new ClassFilter(currentSuiteName, '', this.class));
+ }
+ if (this.notClass !== undefined && this.notClass !== '' && this.notClass !== null) {
+ filterArray.push(new NotClassFilter(currentSuiteName, '', this.notClass));
+ }
+
+ let result = filterArray.map(item => item.filterSuite()).reduce((pre, cur) => pre || cur, false);
+ return result;
+ }
+
+ filterDesc(currentSuiteName, desc, fi, coreContext) {
+ let filterArray = [];
+ if (this.itName !== undefined && this.itName !== '' && this.itName !== null) {
+ filterArray.push(new SuiteAndItNameFilter(currentSuiteName, desc, this.itName));
+ }
+ if (this.class !== undefined && this.class !== '' && this.class !== null) {
+ filterArray.push(new ClassFilter(currentSuiteName, desc, this.class));
+ }
+ if (this.notClass !== undefined && this.notClass !== '' && this.notClass !== null) {
+ filterArray.push(new NotClassFilter(currentSuiteName, desc, this.notClass));
+ }
+ if (typeof (this.filter) !== 'undefined' && this.filter !== 0 && fi !== 0) {
+ filterArray.push(new TestTypesFilter('', '', fi, this.filter));
+ }
+ let result = filterArray.map(item => item.filterIt()).reduce((pre, cur) => pre || cur, false);
+ return result;
+ }
+
+ isRandom() {
+ return this.random || false;
+ }
+
+ isBreakOnError() {
+ return this.breakOnError !== 'true' ? false : true;
+ }
+
+ setSupportAsync(value) {
+ this.supportAsync = value;
+ }
+
+ isSupportAsync() {
+ return this.supportAsync;
+ }
+
+ translateParams(parameters) {
+ const keySet = new Set([
+ '-s class', '-s notClass', '-s suite', '-s itName',
+ '-s level', '-s testType', '-s size', '-s timeout',
+ '-s dryRun', '-s random', '-s breakOnError', '-s stress',
+ '-s coverage', 'class', 'notClass', 'suite', 'itName',
+ 'level', 'testType', 'size', 'timeout', 'dryRun', 'random',
+ 'breakOnError', 'stress', 'coverage'
+ ]);
+ let targetParams = {};
+ for (const key in parameters) {
+ if (keySet.has(key)) {
+ var newKey = key.replace("-s ", "");
+ targetParams[newKey] = parameters[key];
+ }
+ }
+ return targetParams;
+ }
+ translateParamsToString(parameters) {
+ const keySet = new Set([
+ '-s class', '-s notClass', '-s suite', '-s itName',
+ '-s level', '-s testType', '-s size', '-s timeout',
+ '-s dryRun', '-s random', '-s breakOnError', '-s stress',
+ '-s coverage','class', 'notClass', 'suite', 'itName',
+ 'level', 'testType', 'size', 'timeout', 'dryRun', 'random',
+ 'breakOnError', 'stress', 'coverage'
+ ]);
+ let targetParams = '';
+ for (const key in parameters) {
+ if (keySet.has(key)) {
+ targetParams += ' ' + key + ' ' + parameters[key];
+ }
+ }
+ return targetParams.trim();
+ }
+
+ execute() {
+ }
+}
+
+export {
+ ConfigService
+};
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/coverage/coverageCollect.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/coverage/coverageCollect.js
new file mode 100644
index 0000000000000000000000000000000000000000..4707dea3eba464fd7446bf215481f4049b0cfe00
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/coverage/coverageCollect.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2023 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import SysTestKit from "../kit/SysTestKit";
+
+export async function collectCoverageData() {
+ if (globalThis.__coverage__ === undefined) {
+ return;
+ }
+ const strJson = JSON.stringify(globalThis.__coverage__);
+ const strLen = strJson.length;
+ const maxLen = 500;
+ const maxCount = Math.floor(strLen / maxLen);
+ const OHOS_REPORT_COVERAGE_DATA = 'OHOS_REPORT_COVERAGE_DATA:';
+ for (let count = 0; count <= maxCount; count++) {
+ await SysTestKit.print(`${OHOS_REPORT_COVERAGE_DATA} ${strJson.substring(count * maxLen, (count + 1) * maxLen)}`);
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/kit/SysTestKit.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/kit/SysTestKit.js
new file mode 100644
index 0000000000000000000000000000000000000000..d73d46d912dc2f86a645327548b5d58a17c168bf
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/kit/SysTestKit.js
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class SysTestKit {
+
+ static delegator = null;
+ static systemTime = null;
+
+ constructor() {
+ this.id = 'sysTestKit';
+ this.index = 0;
+ }
+
+ static actionStart(tag) {
+ console.info(JSON.stringify(tag));
+ var message = '\n' + 'OHOS_REPORT_ACTIONSTART: ' + JSON.stringify(tag) + '\n';
+ SysTestKit.print(message);
+ console.info(tag + ' actionStart print success');
+ }
+
+ static actionEnd(tag) {
+ console.info(JSON.stringify(tag));
+ var message = '\n' + 'OHOS_REPORT_ACTIONEND: ' + JSON.stringify(tag) + '\n';
+ SysTestKit.print(message);
+ console.info(tag + ' actionEnd print success');
+ }
+
+ static async existKeyword(keyword, timeout) {
+ let reg = new RegExp(/^[a-zA-Z0-9]{1,}$/)
+ if (!reg.test(keyword)) {
+ throw new Error('keyword must contain more than one string, and only letters and numbers are supported.')
+ }
+ timeout = timeout || 4;
+
+ let searchResult = false;
+ let cmd = 'hilog -x | grep -i \'' + keyword + '\' | wc -l';
+ await executePromise(cmd, timeout).then((data) => {
+ searchResult = data;
+ });
+ return searchResult;
+ }
+ static async print(message) {
+ if ('printSync' in SysTestKit.delegator) {
+ console.debug(`printSync called ...`);
+ SysTestKit.delegator.printSync(message);
+ } else {
+ await SysTestKit.delegator.print(message);
+ }
+ }
+
+ static async getRealTime() {
+ let currentTime = new Date().getTime();
+ if (SysTestKit.systemTime !== null && SysTestKit.systemTime !== undefined) {
+ await SysTestKit.systemTime.getRealTime().then((time) => {
+ console.info(`systemTime.getRealTime success data: ${JSON.stringify(time)}`);
+ currentTime = time;
+ }).catch((error) => {
+ console.error(`failed to systemTime.getRealTime because ${JSON.stringify(error)}`);
+ });
+ }
+ return currentTime;
+ }
+}
+
+function executePromise(cmd, timeout) {
+ return new Promise((resolve, reject) => {
+ SysTestKit.delegator.executeShellCommand(cmd, timeout,
+ (error, data) => {
+ console.info('existKeyword CallBack: err : ' + JSON.stringify(error));
+ console.info('existKeyword CallBack: data : ' + JSON.stringify(data));
+ resolve(parseInt(data.stdResult) > 3 ? true : false);
+ });
+ });
+}
+
+export default SysTestKit;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/ArgumentMatchers.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/ArgumentMatchers.js
new file mode 100644
index 0000000000000000000000000000000000000000..6a9d7aac464e95383ea31385284b6603c34e084c
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/ArgumentMatchers.js
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class ArgumentMatchers {
+ ANY = "";
+ ANY_STRING = "";
+ ANY_BOOLEAN = "";
+ ANY_NUMBER = "";
+ ANY_OBJECT = "";
+ ANY_FUNCTION = "";
+ MATCH_REGEXS = "";
+
+ static any() {
+ }
+
+ static anyString() {
+ }
+
+ static anyBoolean() {
+ }
+
+ static anyNumber() {
+ }
+
+ static anyObj() {
+ }
+
+ static anyFunction() {
+ }
+
+ static matchRegexs() {
+ let regex = arguments[0];
+ if (ArgumentMatchers.isRegExp(regex)) {
+ return regex;
+ }
+ throw Error("not a regex");
+ }
+
+ static isRegExp(value) {
+ return Object.prototype.toString.call(value) === "[object RegExp]";
+ }
+
+ matcheReturnKey() {
+ let arg = arguments[0];
+ let regex = arguments[1];
+ let stubSetKey = arguments[2];
+
+ if (stubSetKey && stubSetKey == this.ANY) {
+ return this.ANY;
+ }
+
+ if (typeof arg === "string" && !regex) {
+ return this.ANY_STRING;
+ }
+
+ if (typeof arg === "boolean" && !regex) {
+ return this.ANY_BOOLEAN;
+ }
+
+ if (typeof arg === "number" && !regex) {
+ return this.ANY_NUMBER;
+ }
+
+ if (typeof arg === "object" && !regex) {
+ return this.ANY_OBJECT;
+ }
+
+ if (typeof arg === "function" && !regex) {
+ return this.ANY_FUNCTION;
+ }
+
+ if (typeof arg === "string" && regex) {
+ return regex.test(arg);
+ }
+
+ return null;
+ }
+
+ matcheStubKey() {
+ let key = arguments[0];
+
+ if (key === ArgumentMatchers.any) {
+ return this.ANY;
+ }
+
+ if (key === ArgumentMatchers.anyString) {
+ return this.ANY_STRING;
+ }
+ if (key === ArgumentMatchers.anyBoolean) {
+ return this.ANY_BOOLEAN;
+ }
+ if (key === ArgumentMatchers.anyNumber) {
+ return this.ANY_NUMBER;
+ }
+ if (key === ArgumentMatchers.anyObj) {
+ return this.ANY_OBJECT;
+ }
+ if (key === ArgumentMatchers.anyFunction) {
+ return this.ANY_FUNCTION;
+ }
+
+ if (ArgumentMatchers.isRegExp(key)) {
+ return key;
+ }
+
+ return null;
+ }
+}
+
+export default ArgumentMatchers;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/ExtendInterface.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/ExtendInterface.js
new file mode 100644
index 0000000000000000000000000000000000000000..c6a866a6df662ad10a7f6869dcbc2381fa47bcdc
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/ExtendInterface.js
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class ExtendInterface {
+ constructor(mocker) {
+ this.mocker = mocker;
+ }
+
+ stub() {
+ this.params = arguments;
+ return this;
+ }
+
+ stubMockedCall(returnInfo) {
+ this.mocker.stubApply(this, this.params, returnInfo);
+ }
+
+ afterReturn(value) {
+ this.stubMockedCall(function () {
+ return value;
+ });
+ }
+
+ afterReturnNothing() {
+ this.stubMockedCall(function () {
+ return undefined;
+ });
+ }
+
+ afterAction(action) {
+ this.stubMockedCall(action);
+ }
+
+ afterThrow(msg) {
+ this.stubMockedCall(function () {
+ throw msg;
+ });
+ }
+
+ clear() {
+ this.mocker.clear();
+ }
+}
+
+export default ExtendInterface;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/MockKit.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/MockKit.js
new file mode 100644
index 0000000000000000000000000000000000000000..a23462472c023f0ef81a6a6d274f14f8649a8dc0
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/MockKit.js
@@ -0,0 +1,256 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import ExtendInterface from "./ExtendInterface";
+import VerificationMode from "./VerificationMode";
+import ArgumentMatchers from "./ArgumentMatchers";
+
+class MockKit {
+
+ constructor() {
+ this.mFunctions = [];
+ this.stubs = new Map();
+ this.recordCalls = new Map();
+ this.currentSetKey = null;
+ this.mockObj = null;
+ this.recordMockedMethod = new Map();
+ }
+
+ init() {
+ this.reset();
+ }
+
+ reset() {
+ this.mFunctions = [];
+ this.stubs = {};
+ this.recordCalls = {};
+ this.currentSetKey = null;
+ this.mockObj = null;
+ this.recordMockedMethod = new Map();
+ }
+
+ clearAll() {
+ this.reset();
+ var props = Object.keys(this);
+ for (var i = 0; i < props.length; i++) {
+ delete this[props[i]];
+ }
+
+ var props = Object.getOwnPropertyNames(this);
+ for (var i = 0; i < props.length; i++) {
+ delete this[props[i]];
+ }
+ for (var key in this) {
+ delete this[key];
+ }
+ }
+
+ clear(obj) {
+ if (!obj) throw Error("Please enter an object to be cleaned");
+ if (typeof (obj) != 'object') throw new Error('Not a object');
+ this.recordMockedMethod.forEach(function (value, key, map) {
+ if (key) {
+ obj[key] = value;
+ }
+ });
+ }
+
+ ignoreMock(obj, method) {
+ if (typeof (obj) != 'object') throw new Error('Not a object');
+ if (typeof (method) != 'function') throw new Error('Not a function');
+ let og = this.recordMockedMethod.get(method.propName);
+ if (og) {
+ obj[method.propName] = og;
+ this.recordMockedMethod.set(method.propName, undefined);
+ }
+ }
+
+ extend(dest, source) {
+ dest["stub"] = source["stub"];
+ dest["afterReturn"] = source["afterReturn"];
+ dest["afterReturnNothing"] = source["afterReturnNothing"];
+ dest["afterAction"] = source["afterAction"];
+ dest["afterThrow"] = source["afterThrow"];
+ dest["stubMockedCall"] = source["stubMockedCall"];
+ dest["clear"] = source["clear"];
+ return dest;
+ }
+
+ stubApply(f, params, returnInfo) {
+ let values = this.stubs.get(f);
+ if (!values) {
+ values = new Map();
+ }
+ let key = params[0];
+ if (typeof key == "undefined") {
+ key = "anonymous-mock-" + f.propName;
+ }
+ let matcher = new ArgumentMatchers();
+ if (matcher.matcheStubKey(key)) {
+ key = matcher.matcheStubKey(key);
+ if (key) {
+ this.currentSetKey = key;
+ }
+ }
+ values.set(key, returnInfo);
+ this.stubs.set(f, values);
+ }
+
+ getReturnInfo(f, params) {
+ let values = this.stubs.get(f);
+ if (!values) {
+ return undefined;
+ }
+ let retrunKet = params[0];
+ if (typeof retrunKet == "undefined") {
+ retrunKet = "anonymous-mock-" + f.propName;
+ }
+ let stubSetKey = this.currentSetKey;
+
+ if (this.currentSetKey && (typeof (retrunKet) != "undefined")) {
+ retrunKet = stubSetKey;
+ }
+ let matcher = new ArgumentMatchers();
+ if (matcher.matcheReturnKey(params[0], undefined, stubSetKey) && matcher.matcheReturnKey(params[0], undefined, stubSetKey) != stubSetKey) {
+ retrunKet = params[0];
+ }
+
+ values.forEach(function (value, key, map) {
+ if (ArgumentMatchers.isRegExp(key) && matcher.matcheReturnKey(params[0], key)) {
+ retrunKet = key;
+ }
+ });
+
+ return values.get(retrunKet);
+ }
+
+ findName(obj, value) {
+ let properties = this.findProperties(obj);
+ let name = null;
+ properties.forEach(
+ function (va1, idx, array) {
+ if (obj[va1] === value) {
+ name = va1;
+ }
+ }
+ );
+ return name;
+ }
+
+ isFunctionFromPrototype(f, container, propName) {
+ if (container.constructor != Object && container.constructor.prototype !== container) {
+ return container.constructor.prototype[propName] === f;
+ }
+ return false;
+ }
+
+ findProperties(obj, ...arg) {
+ function getProperty(new_obj) {
+ if (new_obj.__proto__ === null) {
+ return [];
+ }
+ let properties = Object.getOwnPropertyNames(new_obj);
+ return [...properties, ...getProperty(new_obj.__proto__)];
+ }
+ return getProperty(obj);
+ }
+
+ recordMethodCall(originalMethod, args) {
+ Function.prototype.getName = function () {
+ return this.name || this.toString().match(/function\s*([^(]*)\(/)[1];
+ };
+ let name = originalMethod.getName();
+ let arglistString = name + '(' + Array.from(args).toString() + ')';
+ let records = this.recordCalls.get(arglistString);
+ if (!records) {
+ records = 0;
+ }
+ records++;
+ this.recordCalls.set(arglistString, records);
+ }
+
+ mockFunc(originalObject, originalMethod) {
+ let tmp = this;
+ this.originalMethod = originalMethod;
+ let f = function () {
+ let args = arguments;
+ let action = tmp.getReturnInfo(f, args);
+ if (originalMethod) {
+ tmp.recordMethodCall(originalMethod, args);
+ }
+ if (action) {
+ return action.apply(this, args);
+ }
+ };
+
+ f.container = null || originalObject;
+ f.original = originalMethod || null;
+
+ if (originalObject && originalMethod) {
+ if (typeof (originalMethod) != 'function') throw new Error('Not a function');
+ var name = this.findName(originalObject, originalMethod);
+ originalObject[name] = f;
+ this.recordMockedMethod.set(name, originalMethod);
+ f.propName = name;
+ f.originalFromPrototype = this.isFunctionFromPrototype(f.original, originalObject, f.propName);
+ }
+ f.mocker = this;
+ this.mFunctions.push(f);
+ this.extend(f, new ExtendInterface(this));
+ return f;
+ }
+
+ verify(methodName, argsArray) {
+ if (!methodName) {
+ throw Error("not a function name");
+ }
+ let a = this.recordCalls.get(methodName + '(' + argsArray.toString() + ')');
+ return new VerificationMode(a ? a : 0);
+ }
+
+ mockObject(object) {
+ if (!object || typeof object === "string") {
+ throw Error(`this ${object} cannot be mocked`);
+ }
+ const _this = this;
+ let mockedObject = {};
+ let keys = Reflect.ownKeys(object);
+ keys.filter(key => (typeof Reflect.get(object, key)) === 'function')
+ .forEach(key => {
+ mockedObject[key] = object[key];
+ mockedObject[key] = _this.mockFunc(mockedObject, mockedObject[key]);
+ });
+ return mockedObject;
+ }
+}
+
+function ifMockedFunction(f) {
+ if (Object.prototype.toString.call(f) != "[object Function]" &&
+ Object.prototype.toString.call(f) != "[object AsyncFunction]") {
+ throw Error("not a function");
+ }
+ if (!f.stub) {
+ throw Error("not a mock function");
+ }
+ return true;
+}
+
+function when(f) {
+ if (ifMockedFunction(f)) {
+ return f.stub.bind(f);
+ }
+}
+
+export {MockKit, when};
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/VerificationMode.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/VerificationMode.js
new file mode 100644
index 0000000000000000000000000000000000000000..7bd04c8473985ec57f5b14fc3ae84e9cf7b31f39
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/mock/VerificationMode.js
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {expect} from '../../interface';
+
+class VerificationMode {
+ constructor(times) {
+ this.doTimes = times;
+ }
+
+ times(count) {
+ expect(count).assertEqual(this.doTimes);
+ }
+
+ never() {
+ console.log(this.doTimes);
+ expect(0).assertEqual(this.doTimes);
+ }
+
+ once() {
+ expect(1).assertEqual(this.doTimes);
+ }
+
+ atLeast(count) {
+ if (count > this.doTimes) {
+ throw Error('failed ' + count + ' greater than the actual execution times of method');
+ }
+ }
+
+ atMost(count) {
+ if (count < this.doTimes) {
+ throw Error('failed ' + count + ' less than the actual execution times of method');
+ }
+ }
+}
+
+export default VerificationMode;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/report/OhReport.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/report/OhReport.js
new file mode 100644
index 0000000000000000000000000000000000000000..da120dd09c0e74e46b9138b7598661e380010210
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/report/OhReport.js
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import SysTestKit from "../kit/SysTestKit";
+import {collectCoverageData} from '../coverage/coverageCollect';
+
+class OhReport {
+ constructor(attr) {
+ this.delegator = attr.delegator;
+ this.abilityDelegatorArguments = attr.abilityDelegatorArguments;
+ this.id = 'report';
+ this.index = 0;
+ this.duration = 0;
+ }
+
+ init(coreContext) {
+ this.coreContext = coreContext;
+ this.suiteService = this.coreContext.getDefaultService('suite');
+ this.specService = this.coreContext.getDefaultService('spec');
+ }
+
+ taskStart() {
+ }
+
+ async taskDone() {
+ if (this.abilityDelegatorArguments !== null) {
+ this.taskDoneTime = new Date().getTime();
+ let summary = this.suiteService.getSummary();
+ const configService = this.coreContext.getDefaultService('config');
+ if (configService['coverage'] === 'true') {
+ await collectCoverageData();
+ }
+ let message = '\n' + 'OHOS_REPORT_RESULT: stream=Tests run: ' + summary.total + ', Failure: ' + summary.failure;
+ message += ', Error: ' + summary.error;
+ message += ', Pass: ' + summary.pass;
+ message += ', Ignore: ' + summary.ignore;
+ message += '\n' + 'OHOS_REPORT_CODE: ' + (summary.failure > 0 ? -1 : 0) + '\n';
+ let isHasError = summary.failure > 0 || summary.error > 0;
+ let config = this.coreContext.getDefaultService('config');
+ if (config.isBreakOnError() && isHasError) {
+ // 未执行全部说明
+ message += '\n' + 'OHOS_REPORT_RESULT: breakOnError model, Stopping whole test suite if one specific test case failed or error' + '\n';
+ }
+ message += 'OHOS_REPORT_STATUS: taskconsuming=' + summary.duration + '\n';
+ console.info(message);
+ await SysTestKit.print(message);
+ }
+ console.info('report print success');
+ this.delegator.finishTest('your test finished!!!', 0, () => { });
+ }
+
+ incorrectFormat() {
+ if (this.coreContext.getDefaultService('config').filterValid.length !== 0) {
+ var value = this.coreContext.getDefaultService('config').filterValid;
+ var message = 'this param ' + value.join(',') + ' is invalid' + '\n';
+ this.delegator.finishTest(message, 0, () => {
+ });
+ }
+ }
+
+ async suiteStart() {
+ if (this.abilityDelegatorArguments !== null) {
+ let message = '\n' + 'OHOS_REPORT_SUM: ' + this.suiteService.getCurrentRunningSuite().getSpecsNum();
+ message += '\n' + 'OHOS_REPORT_STATUS: class=' + this.suiteService.getCurrentRunningSuite().description + '\n';
+ console.info(message);
+ await SysTestKit.print(message);
+ console.info(this.suiteService.getCurrentRunningSuite().description + ' suiteStart print success');
+ }
+ }
+
+ async suiteDone() {
+ if (this.abilityDelegatorArguments !== null) {
+ let message = '\n' + 'OHOS_REPORT_STATUS: class=' + this.suiteService.getCurrentRunningSuite().description;
+ message += '\n' + 'OHOS_REPORT_STATUS: suiteconsuming=' + this.suiteService.getCurrentRunningSuite().duration + '\n';
+ console.info(message);
+ await SysTestKit.print(message);
+ console.info(this.suiteService.getCurrentRunningSuite().description + ' suiteDone print success');
+ }
+ }
+
+ async specStart() {
+ if (this.abilityDelegatorArguments !== null) {
+ let message = '\n' + 'OHOS_REPORT_STATUS: class=' + this.suiteService.getCurrentRunningSuite().description;
+ message += '\n' + 'OHOS_REPORT_STATUS: current=' + (++this.index);
+ message += '\n' + 'OHOS_REPORT_STATUS: id=JS';
+ message += '\n' + 'OHOS_REPORT_STATUS: numtests=' + this.specService.getTestTotal();
+ message += '\n' + 'OHOS_REPORT_STATUS: stream=';
+ message += '\n' + 'OHOS_REPORT_STATUS: test=' + this.specService.currentRunningSpec.description;
+ message += '\n' + 'OHOS_REPORT_STATUS_CODE: 1' + '\n';
+ console.info(message);
+ await SysTestKit.print(message);
+ console.info(this.specService.currentRunningSpec.description + ' specStart start print success');
+ }
+ }
+
+ async specDone() {
+ if (this.abilityDelegatorArguments !== null) {
+ let message = '\n' + 'OHOS_REPORT_STATUS: class=' + this.suiteService.getCurrentRunningSuite().description;
+ message += '\n' + 'OHOS_REPORT_STATUS: current=' + (this.index);
+ message += '\n' + 'OHOS_REPORT_STATUS: id=JS';
+ message += '\n' + 'OHOS_REPORT_STATUS: numtests=' + this.specService.getTestTotal();
+ let errorMsg = '';
+ if (this.specService.currentRunningSpec.error) {
+ message += '\n' + 'OHOS_REPORT_STATUS: stack=' + this.specService.currentRunningSpec.error.message;
+ message += '\n' + 'OHOS_REPORT_STATUS: stream=';
+ message += '\n' + 'Error in ' + this.specService.currentRunningSpec.description;
+ message += '\n' + this.specService.currentRunningSpec.error.message;
+ message += '\n' + 'OHOS_REPORT_STATUS: test=' + this.specService.currentRunningSpec.description;
+ message += '\n' + 'OHOS_REPORT_STATUS_CODE: -1' + '\n';
+ } else if (this.specService.currentRunningSpec.result) {
+ if (this.specService.currentRunningSpec.result.failExpects.length > 0) {
+ this.specService.currentRunningSpec.result.failExpects.forEach(failExpect => {
+ errorMsg = failExpect.message || ('expect ' + failExpect.actualValue + ' ' + failExpect.checkFunc + ' ' + (failExpect.expectValue));
+ });
+ message += '\n' + 'OHOS_REPORT_STATUS: stack=' + errorMsg;
+ message += '\n' + 'OHOS_REPORT_STATUS: stream=';
+ message += '\n' + 'Error in ' + this.specService.currentRunningSpec.description;
+ message += '\n' + errorMsg + '\n' + 'OHOS_REPORT_STATUS: test=' + this.specService.currentRunningSpec.description;
+ message += '\n' + 'OHOS_REPORT_STATUS_CODE: -2' + '\n';
+ } else {
+ message += '\n' + 'OHOS_REPORT_STATUS: stream=';
+ message += '\n' + 'OHOS_REPORT_STATUS: test=' + this.specService.currentRunningSpec.description;
+ message += '\n' + 'OHOS_REPORT_STATUS_CODE: 0' + '\n';
+ }
+ } else {
+ message += '\n';
+ }
+ message += 'OHOS_REPORT_STATUS: consuming=' + this.specService.currentRunningSpec.duration + '\n';
+ console.info(message);
+ await SysTestKit.print(message);
+ console.info(this.specService.currentRunningSpec.description + ' specDone end print success');
+ }
+ }
+}
+
+export default OhReport;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/report/ReportExtend.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/report/ReportExtend.js
new file mode 100644
index 0000000000000000000000000000000000000000..852fbcd5cbf97e776ebe5177a029df0f516594a5
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/module/report/ReportExtend.js
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+class ReportExtend {
+ constructor(fileModule) {
+ this.id = 'extend';
+ this.fileModule = fileModule;
+ }
+
+ init(coreContext) {
+ this.coreContext = coreContext;
+ this.suiteService = this.coreContext.getDefaultService('suite');
+ }
+
+ taskStart() {
+
+ }
+
+ taskDone() {
+ const report = {
+ tag: 'testsuites',
+ name: 'summary_report',
+ timestamp: new Date().toDateString(),
+ time: '1',
+ errors: 0,
+ failures: 0,
+ tests: 0,
+ children: []
+ };
+ const rootSuite = this.suiteService.rootSuite;
+ if (rootSuite && rootSuite.childSuites) {
+ for (let testsuite of rootSuite.childSuites) {
+ let suiteReport = {
+ tag: 'testsuite',
+ name: testsuite['description'],
+ errors: 0,
+ tests: 0,
+ failures: 0,
+ time: '0.1',
+ children: []
+ };
+ let specs = testsuite['specs'];
+ for (let testcase of specs) {
+ report.tests++;
+ suiteReport.tests++;
+ let caseReport = {
+ tag: 'testcase',
+ name: testcase['description'],
+ status: 'run',
+ time: '0.0',
+ classname: testsuite['description']
+ };
+ if (testcase.error) {
+ caseReport['result'] = false;
+ caseReport['children'] = [{
+ tag: 'error',
+ type: '',
+ message: testcase.error.message
+ }];
+ report.errors++;
+ suiteReport.errors++;
+ } else if (testcase.result.failExpects.length > 0) {
+ caseReport['result'] = false;
+ let message = '';
+ testcase.result.failExpects.forEach(failExpect => {
+ message += failExpect.message || ('expect ' + failExpect.actualValue + ' ' + failExpect.checkFunc + ' ' + (failExpect.expectValue || '')) + ';';
+ });
+ caseReport['children'] = [{
+ tag: 'failure',
+ type: '',
+ message: message
+ }];
+ report.failures++;
+ suiteReport.failures++;
+ } else {
+ caseReport['result'] = true;
+ }
+ suiteReport.children.push(caseReport);
+ }
+ report.children.push(suiteReport);
+ }
+ }
+
+ let reportXml = '\n' + json2xml(report);
+ this.fileModule.writeText({
+ uri: 'internal://app/report.xml',
+ text: reportXml,
+ success: function () {
+ console.info('call success callback success');
+ },
+ fail: function (data, code) {
+ console.info('call fail callback success:');
+ },
+ complete: function () {
+ console.info('call complete callback success');
+ }
+ });
+ }
+}
+
+function json2xml(json) {
+ let tagName;
+ let hasChildren = false;
+ let childrenStr = '';
+ let attrStr = '';
+ for (let key in json) {
+ if (key === 'tag') {
+ tagName = json[key];
+ } else if (key === 'children') {
+ if (json[key].length > 0) {
+ hasChildren = true;
+ for (let child of json[key]) {
+ childrenStr += json2xml(child);
+ }
+ }
+ } else {
+ attrStr += ` ${key}="${json[key]}"`;
+ }
+ }
+ let xml = `<${tagName}${attrStr}`;
+ xml += hasChildren ? `>${childrenStr}${tagName}>` : '/>';
+ return xml;
+}
+
+export default ReportExtend;
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/service.js b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/service.js
new file mode 100644
index 0000000000000000000000000000000000000000..e55a2e4a2db3fdef4b983fa9cb63bf5c58b76fb4
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/oh_modules/.ohpm/@ohos+hypium@1.0.6/oh_modules/@ohos/hypium/src/main/service.js
@@ -0,0 +1,929 @@
+/*
+ * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import SysTestKit from "./module/kit/SysTestKit";
+
+class AssertException extends Error {
+ constructor(message) {
+ super();
+ this.name = "AssertException";
+ this.message = message;
+ }
+}
+
+function getFuncWithArgsZero(func, timeout, isStressTest) {
+ return new Promise(async (resolve, reject) => {
+ let timer = null;
+ if (!isStressTest) {
+ timer = setTimeout(() => {
+ reject(new Error('execute timeout ' + timeout + 'ms'));
+ }, timeout);
+ }
+ try {
+ await func();
+ } catch (err) {
+ reject(err);
+ }
+ timer !== null ? clearTimeout(timer) : null;
+ resolve();
+ });
+}
+
+function getFuncWithArgsOne(func, timeout, isStressTest) {
+ return new Promise(async (resolve, reject) => {
+ let timer = null;
+ if (!isStressTest) {
+ timer = setTimeout(() => {
+ reject(new Error('execute timeout ' + timeout + 'ms'));
+ }, timeout);;
+ }
+
+ function done() {
+ timer !== null ? clearTimeout(timer) : null;
+ resolve();
+ }
+
+ try {
+ await func(done);
+ } catch (err) {
+ timer !== null ? clearTimeout(timer) : null;
+ reject(err);
+ }
+ });
+}
+
+function getFuncWithArgsTwo(func, timeout, paramItem, isStressTest) {
+ return new Promise(async (resolve, reject) => {
+ let timer = null;
+ if (!isStressTest) {
+ timer = setTimeout(() => {
+ reject(new Error('execute timeout ' + timeout + 'ms'));
+ }, timeout);
+ }
+
+ function done() {
+ timer !== null ? clearTimeout(timer) : null;
+ resolve();
+ }
+
+ try {
+ await func(done, paramItem);
+ } catch (err) {
+ timer !== null ? clearTimeout(timer) : null;
+ reject(err);
+ }
+ });
+}
+
+function processFunc(coreContext, func) {
+ let argNames = ((func || '').toString()
+ .replace(/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg, '')
+ .match(/^(function)?\s*[^\(]*\(\s*([^\)]*)\)/m) || ['', '', ''])[2]
+ .split(',') // split parameters
+ .map(item => item.replace(/^\s*(_?)(.+?)\1\s*$/, name => name.split('=')[0].trim()))
+ .filter(String);
+ let funcLen = func.length;
+ let processedFunc;
+ const config = coreContext.getDefaultService('config');
+ config.setSupportAsync(true);
+ const timeout = + (config.timeout === undefined ? 5000 : config.timeout);
+ const isStressTest = (coreContext.getServices('dataDriver') !== undefined || config.getStress() > 1);
+ switch (funcLen) {
+ case 0: {
+ processedFunc = function () {
+ return getFuncWithArgsZero(func, timeout, isStressTest);
+ };
+ break;
+ }
+ case 1: {
+ if (argNames[0] === 'data') {
+ processedFunc = function (paramItem) {
+ func(paramItem);
+ };
+ } else {
+ processedFunc = function () {
+ return getFuncWithArgsOne(func, timeout, isStressTest);
+ };
+ }
+ break;
+ }
+ default: {
+ processedFunc = function (paramItem) {
+ return getFuncWithArgsTwo(func, timeout, paramItem, isStressTest);
+ };
+ break;
+ }
+ }
+ return processedFunc;
+}
+
+function secureRandomNumber() {
+ return crypto.randomBytes(8).readUInt32LE() / 0xffffffff;
+}
+
+class SuiteService {
+ constructor(attr) {
+ this.id = attr.id;
+ this.rootSuite = new SuiteService.Suite({});
+ this.currentRunningSuite = this.rootSuite;
+ this.suitesStack = [this.rootSuite];
+ }
+
+ describe(desc, func) {
+ const configService = this.coreContext.getDefaultService('config');
+ if (configService.filterSuite(desc)) {
+ console.info('filter suite :' + desc);
+ return;
+ }
+ const suite = new SuiteService.Suite({description: desc});
+ if (typeof this.coreContext.getServices('dataDriver') !== 'undefined' && configService['dryRun'] !== 'true') {
+ let suiteStress = this.coreContext.getServices('dataDriver').dataDriver.getSuiteStress(desc);
+ for (let i = 1; i < suiteStress; i++) {
+ this.currentRunningSuite.childSuites.push(suite);
+ }
+ }
+ this.currentRunningSuite.childSuites.push(suite);
+ this.currentRunningSuite = suite;
+ this.suitesStack.push(suite);
+ func.call();
+ let childSuite = this.suitesStack.pop();
+ if (this.suitesStack.length === 0) {
+ this.currentRunningSuite = childSuite;
+ this.suitesStack.push(childSuite);
+ }
+ if (this.suitesStack.length > 1) {
+ this.currentRunningSuite = this.suitesStack.pop();
+ } else {
+ this.currentRunningSuite = this.suitesStack.pop();
+ this.suitesStack.push(this.currentRunningSuite);
+ }
+ }
+
+ beforeAll(func) {
+ this.currentRunningSuite.beforeAll.push(processFunc(this.coreContext, func));
+ }
+
+ beforeEach(func) {
+ this.currentRunningSuite.beforeEach.push(processFunc(this.coreContext, func));
+ }
+
+ afterAll(func) {
+ this.currentRunningSuite.afterAll.push(processFunc(this.coreContext, func));
+ }
+
+ afterEach(func) {
+ this.currentRunningSuite.afterEach.push(processFunc(this.coreContext, func));
+ }
+
+ getCurrentRunningSuite() {
+ return this.currentRunningSuite;
+ }
+
+ setCurrentRunningSuite(suite) {
+ this.currentRunningSuite = suite;
+ }
+
+ traversalResults(suite, obj, breakOnError) {
+ if (suite.childSuites.length === 0 && suite.specs.length === 0) {
+ return obj;
+ }
+ if (suite.specs.length > 0) {
+ for (const itItem of suite.specs) {
+ obj.total++;
+ if (breakOnError && (obj.error > 0 || obj.failure > 0)) { // breakOnError模式
+ continue;
+ }
+ if (itItem.error) {
+ obj.error++;
+ } else if (itItem.result.failExpects.length > 0) {
+ obj.failure++;
+ } else if (itItem.result.pass === true) {
+ obj.pass++;
+ }
+ }
+ }
+
+ obj.duration += suite.duration;
+
+ if (suite.childSuites.length > 0) {
+ for (const suiteItem of suite.childSuites) {
+ this.traversalResults(suiteItem, obj, breakOnError);
+ }
+ }
+ }
+
+ getSummary() {
+ let suiteService = this.coreContext.getDefaultService('suite');
+ let rootSuite = suiteService.rootSuite;
+ const specService = this.coreContext.getDefaultService('spec');
+ const configService = this.coreContext.getDefaultService('config');
+ let breakOnError = configService.isBreakOnError();
+ let isError = specService.getStatus();
+ let isBreaKOnError = breakOnError && isError;
+ let obj = {total: 0, failure: 0, error: 0, pass: 0, ignore: 0, duration: 0};
+ for (const suiteItem of rootSuite.childSuites) {
+ this.traversalResults(suiteItem, obj, isBreaKOnError);
+ }
+ obj.ignore = obj.total - obj.pass - obj.failure - obj.error;
+ return obj;
+ }
+
+ init(coreContext) {
+ this.coreContext = coreContext;
+ }
+
+ traversalSuites(suite, obj, configService) {
+ if (suite.childSuites.length === 0 && suite.specs.length === 0) {
+ return [];
+ }
+ if (suite.specs.length > 0) {
+ let itArray = [];
+ for (const itItem of suite['specs']) {
+ if (!configService.filterDesc(suite.description, itItem.description, itItem.fi, null)) {
+ itArray.push({'itName': itItem.description});
+ }
+ }
+ obj[suite.description] = itArray;
+ }
+
+ if (suite.childSuites.length > 0) {
+ let suiteArray = [];
+ for (const suiteItem of suite.childSuites) {
+ let suiteObj = {};
+ this.traversalSuites(suiteItem, suiteObj, configService);
+ if (!configService.filterSuite(suiteItem.description)) {
+ suiteArray.push(suiteObj);
+ }
+ }
+ obj.suites = suiteArray;
+ }
+ }
+
+ async dryRun(abilityDelegator) {
+ const configService = this.coreContext.getDefaultService('config');
+ let testSuitesObj = {};
+ let suitesArray = [];
+ for (const suiteItem of this.rootSuite.childSuites) {
+ let obj = {};
+ this.traversalSuites(suiteItem, obj, configService);
+ if (!configService.filterSuite(suiteItem.description)) {
+ suitesArray.push(obj);
+ }
+ }
+ testSuitesObj['suites'] = suitesArray;
+
+ let strJson = JSON.stringify(testSuitesObj);
+ let strLen = strJson.length;
+ let maxLen = 500;
+ let maxCount = Math.floor(strLen / maxLen);
+
+ for (let count = 0; count <= maxCount; count++) {
+ await SysTestKit.print(strJson.substring(count * maxLen, (count + 1) * maxLen));
+ }
+ console.info('dryRun print success');
+ abilityDelegator.finishTest('dry run finished!!!', 0, () => { });
+ }
+
+ execute() {
+ const configService = this.coreContext.getDefaultService('config');
+ if (configService.filterValid.length !== 0) {
+ this.coreContext.fireEvents('task', 'incorrectFormat');
+ return;
+ }
+
+ if (configService.isRandom() && this.rootSuite.childSuites.length > 0) {
+ this.rootSuite.childSuites.sort(function () {
+ return Math.random().toFixed(1) > 0.5 ? -1 : 1;
+ });
+ this.currentRunningSuite = this.rootSuite.childSuites[0];
+ }
+
+ if (configService.isSupportAsync()) {
+ let asyncExecute = async () => {
+ await this.coreContext.fireEvents('task', 'taskStart');
+ await this.rootSuite.asyncRun(this.coreContext);
+ };
+ asyncExecute().then(async () => {
+ await this.coreContext.fireEvents('task', 'taskDone');
+ });
+ } else {
+ this.coreContext.fireEvents('task', 'taskStart');
+ this.rootSuite.run(this.coreContext);
+ this.coreContext.fireEvents('task', 'taskDone');
+ }
+ }
+
+ apis() {
+ const _this = this;
+ return {
+ describe: function (desc, func) {
+ return _this.describe(desc, func);
+ },
+ beforeAll: function (func) {
+ return _this.beforeAll(func);
+ },
+ beforeEach: function (func) {
+ return _this.beforeEach(func);
+ },
+ afterAll: function (func) {
+ return _this.afterAll(func);
+ },
+ afterEach: function (func) {
+ return _this.afterEach(func);
+ }
+ };
+ }
+}
+
+SuiteService.Suite = class {
+ constructor(attrs) {
+ this.description = attrs.description || '';
+ this.childSuites = [];
+ this.specs = [];
+ this.beforeAll = [];
+ this.afterAll = [];
+ this.beforeEach = [];
+ this.afterEach = [];
+ this.duration = 0;
+ }
+
+ pushSpec(spec) {
+ this.specs.push(spec);
+ }
+
+ removeSpec(desc) {
+ this.specs = this.specs.filter((item, index) => {
+ return item.description !== desc;
+ });
+ }
+
+ getSpecsNum() {
+ return this.specs.length;
+ }
+
+ isRun(coreContext) {
+ const configService = coreContext.getDefaultService('config');
+ const suiteService = coreContext.getDefaultService('suite');
+ const specService = coreContext.getDefaultService('spec');
+ let breakOnError = configService.isBreakOnError();
+ let isError = specService.getStatus();
+ return breakOnError && isError;
+ }
+
+ run(coreContext) {
+ const suiteService = coreContext.getDefaultService('suite');
+ suiteService.setCurrentRunningSuite(this);
+ if (this.description !== '') {
+ coreContext.fireEvents('suite', 'suiteStart', this);
+ }
+ this.runHookFunc('beforeAll');
+ if (this.specs.length > 0) {
+ const configService = coreContext.getDefaultService('config');
+ if (configService.isRandom()) {
+ this.specs.sort(function () {
+ return Math.random().toFixed(1) > 0.5 ? -1 : 1;
+ });
+ }
+ for (let spec in this.specs) {
+ let isBreakOnError = this.isRun(coreContext);
+ if (isBreakOnError) {
+ break;
+ }
+ this.runHookFunc('beforeEach');
+ spec.run(coreContext);
+ this.runHookFunc('afterEach');
+ }
+ }
+ if (this.childSuites.length > 0) {
+ for (let suite in this.childSuites) {
+ let isBreakOnError = this.isRun(coreContext);
+ if (isBreakOnError) {
+ break;
+ }
+ suite.run(coreContext);
+ suiteService.setCurrentRunningSuite(suite);
+ }
+ }
+ this.runHookFunc('afterAll');
+ if (this.description !== '') {
+ coreContext.fireEvents('suite', 'suiteDone');
+ }
+ }
+
+ async asyncRun(coreContext) {
+ const suiteService = coreContext.getDefaultService('suite');
+ suiteService.setCurrentRunningSuite(this);
+ suiteService.suitesStack.push(this);
+ if (this.description !== '') {
+ await coreContext.fireEvents('suite', 'suiteStart', this);
+ }
+ await this.runAsyncHookFunc('beforeAll');
+ if (this.specs.length > 0) {
+ const configService = coreContext.getDefaultService('config');
+ if (configService.isRandom()) {
+ this.specs.sort(function () {
+ return Math.random().toFixed(1) > 0.5 ? -1 : 1;
+ });
+ }
+ for (let i = 0; i < this.specs.length; i++) {
+ // 遇错即停模式,发现用例有问题,直接返回,不在执行后面的it
+ let isBreakOnError = this.isRun(coreContext);
+ if (isBreakOnError) {
+ console.log("break description :" + this.description);
+ break;
+ }
+ await this.runAsyncHookFunc('beforeEach');
+ await this.specs[i].asyncRun(coreContext);
+ await this.runAsyncHookFunc('afterEach');
+ }
+ }
+
+ if (this.childSuites.length > 0) {
+ for (let i = 0; i < this.childSuites.length; i++) {
+ // 遇错即停模式, 发现用例有问题,直接返回,不在执行后面的description
+ let isBreakOnError = this.isRun(coreContext);
+ if (isBreakOnError) {
+ console.log("break description :" + this.description);
+ break;
+ }
+ await this.childSuites[i].asyncRun(coreContext);
+ }
+ }
+
+ await this.runAsyncHookFunc('afterAll');
+ if (this.description !== '') {
+ await coreContext.fireEvents('suite', 'suiteDone');
+ let childSuite = suiteService.suitesStack.pop();
+ if (suiteService.suitesStack.length === 0) {
+ suiteService.suitesStack.push(childSuite);
+ }
+ if (suiteService.suitesStack.length > 1) {
+ suiteService.setCurrentRunningSuite(suiteService.suitesStack.pop());
+ } else {
+ let currentRunningSuite = suiteService.suitesStack.pop();
+ suiteService.setCurrentRunningSuite(currentRunningSuite);
+ suiteService.suitesStack.push(currentRunningSuite);
+ }
+ }
+ }
+
+ runHookFunc(hookName) {
+ if (this[hookName] && this[hookName].length > 0) {
+ this[hookName].forEach(func => {
+ try {
+ func();
+ } catch (e) {
+ console.error(e);
+ }
+ });
+ }
+ }
+
+ runAsyncHookFunc(hookName) {
+ if (this[hookName] && this[hookName].length > 0) {
+ return new Promise(async resolve => {
+ for (let i = 0; i < this[hookName].length; i++) {
+ try {
+ await this[hookName][i]();
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ resolve();
+ });
+ }
+ }
+};
+
+class SpecService {
+ constructor(attr) {
+ this.id = attr.id;
+ this.totalTest = 0;
+ this.hasError = false;
+ }
+
+ init(coreContext) {
+ this.coreContext = coreContext;
+ }
+
+ setCurrentRunningSpec(spec) {
+ this.currentRunningSpec = spec;
+ }
+
+ setStatus(obj) {
+ this.hasError = obj;
+ }
+
+ getStatus() {
+ return this.hasError;
+ }
+
+ getTestTotal() {
+ return this.totalTest;
+ }
+
+ getCurrentRunningSpec() {
+ return this.currentRunningSpec;
+ }
+
+ it(desc, filter, func) {
+ const configService = this.coreContext.getDefaultService('config');
+ const currentSuiteName = this.coreContext.getDefaultService('suite').getCurrentRunningSuite().description;
+ if (configService.filterDesc(currentSuiteName, desc, filter, this.coreContext)) {
+ console.info('filter it :' + desc);
+ } else {
+ let processedFunc = processFunc(this.coreContext, func);
+ const spec = new SpecService.Spec({description: desc, fi: filter, fn: processedFunc});
+ const suiteService = this.coreContext.getDefaultService('suite');
+ if (typeof this.coreContext.getServices('dataDriver') !== 'undefined' && configService['dryRun'] !== 'true') {
+ let specStress = this.coreContext.getServices('dataDriver').dataDriver.getSpecStress(desc);
+ for (let i = 1; i < specStress; i++) {
+ this.totalTest++;
+ suiteService.getCurrentRunningSuite().pushSpec(spec);
+ }
+ }
+
+ // dryRun 状态下不统计压力测试重复数据
+ if (configService['dryRun'] !== 'true') {
+ let stress = configService.getStress(); // 命令配置压力测试
+ console.info('stress length :' + stress);
+ for (let i = 1; i < stress; i++) {
+ this.totalTest++;
+ suiteService.getCurrentRunningSuite().pushSpec(spec);
+ }
+ }
+ this.totalTest++;
+ suiteService.getCurrentRunningSuite().pushSpec(spec);
+ }
+ }
+
+ apis() {
+ const _this = this;
+ return {
+ it: function (desc, filter, func) {
+ return _this.it(desc, filter, func);
+ }
+ };
+ }
+}
+
+SpecService.Spec = class {
+ constructor(attrs) {
+ this.description = attrs.description || '';
+ this.fi = attrs.fi;
+ this.fn = attrs.fn || function () {
+ };
+ this.result = {
+ failExpects: [],
+ passExpects: []
+ };
+ this.error = undefined;
+ this.duration = 0;
+ this.startTime = 0;
+ this.isExecuted = false; // 当前用例是否执行
+ }
+
+ setResult(coreContext) {
+ const specService = coreContext.getDefaultService('spec');
+ if (this.result.failExpects.length > 0) {
+ this.result.pass = false;
+ specService.setStatus(true);
+ } else {
+ this.result.pass = true;
+ }
+ console.info('testcase ' + this.description + ' result:' + this.result.pass);
+ }
+
+ run(coreContext) {
+ const specService = coreContext.getDefaultService('spec');
+ specService.setCurrentRunningSpec(this);
+ coreContext.fireEvents('spec', 'specStart', this);
+ this.isExecuted = true;
+ try {
+ let dataDriver = coreContext.getServices('dataDriver');
+ if (typeof dataDriver === 'undefined') {
+ this.fn();
+ } else {
+ let suiteParams = dataDriver.dataDriver.getSuiteParams();
+ let specParams = dataDriver.dataDriver.getSpecParams();
+ console.info('[suite params] ' + JSON.stringify(suiteParams));
+ console.info('[spec params] ' + JSON.stringify(specParams));
+ if (this.fn.length === 0) {
+ this.fn();
+ } else if (specParams.length === 0) {
+ this.fn(suiteParams);
+ } else {
+ specParams.forEach(paramItem => this.fn(Object.assign({}, paramItem, suiteParams)));
+ }
+ }
+ this.setResult(coreContext);
+ } catch (e) {
+ this.error = e;
+ specService.setStatus(true);
+ }
+ coreContext.fireEvents('spec', 'specDone', this);
+ }
+
+ async asyncRun(coreContext) {
+ const specService = coreContext.getDefaultService('spec');
+ specService.setCurrentRunningSpec(this);
+
+ await coreContext.fireEvents('spec', 'specStart', this);
+ try {
+ let dataDriver = coreContext.getServices('dataDriver');
+ if (typeof dataDriver === 'undefined') {
+ await this.fn();
+ this.setResult(coreContext);
+ } else {
+ let suiteParams = dataDriver.dataDriver.getSuiteParams();
+ let specParams = dataDriver.dataDriver.getSpecParams();
+ console.info('[suite params] ' + JSON.stringify(suiteParams));
+ console.info('[spec params] ' + JSON.stringify(specParams));
+ if (this.fn.length === 0) {
+ await this.fn();
+ this.setResult(coreContext);
+ } else if (specParams.length === 0) {
+ await this.fn(suiteParams);
+ this.setResult(coreContext);
+ } else {
+ for (const paramItem of specParams) {
+ await this.fn(Object.assign({}, paramItem, suiteParams));
+ this.setResult(coreContext);
+ }
+ }
+ }
+ } catch (e) {
+ if (e instanceof AssertException) {
+ this.fail = e;
+ specService.setStatus(true);
+ } else {
+ this.error = e;
+ specService.setStatus(true);
+ }
+ }
+ this.isExecuted = true;
+ await coreContext.fireEvents('spec', 'specDone', this);
+ }
+
+ filterCheck(coreContext) {
+ const specService = coreContext.getDefaultService('spec');
+ specService.setCurrentRunningSpec(this);
+ return true;
+ }
+
+ addExpectationResult(expectResult) {
+ if (this.result.failExpects.length === 0) {
+ this.result.failExpects.push(expectResult);
+ }
+ throw new AssertException(expectResult.message);
+ }
+};
+
+class ExpectService {
+ constructor(attr) {
+ this.id = attr.id;
+ this.matchers = {};
+ }
+
+ expect(actualValue) {
+ return this.wrapMatchers(actualValue);
+ }
+
+ init(coreContext) {
+ this.coreContext = coreContext;
+ this.addMatchers(this.basicMatchers());
+ }
+
+ addMatchers(matchers) {
+ for (const matcherName in matchers) {
+ if (Object.prototype.hasOwnProperty.call(matchers, matcherName)) {
+ this.matchers[matcherName] = matchers[matcherName];
+ }
+ }
+ }
+
+ basicMatchers() {
+ return {
+ assertTrue: function (actualValue) {
+ return {
+ pass: (actualValue) === true,
+ message: 'expect true, actualValue is ' + actualValue
+ };
+ },
+ assertEqual: function (actualValue, args) {
+ return {
+ pass: (actualValue) === args[0],
+ expectValue: args[0],
+ message: 'expect ' + actualValue + ' equals ' + args[0]
+ };
+ },
+ assertThrow: function (actual, args) {
+ const result = {
+ pass: false
+ };
+ if (typeof actual !== 'function') {
+ result.message = 'toThrow\'s Actual should be a Function';
+ } else {
+ let hasThrow = false;
+ let throwError;
+ try {
+ actual();
+ } catch (e) {
+ hasThrow = true;
+ throwError = e;
+ }
+ if (!hasThrow) {
+ result.message = 'function did not throw an exception';
+ } else if (throwError && throwError.message === args[0]) {
+ result.pass = true;
+ } else {
+ result.message = `expect to throw ${args[0]} , actual throw ${throwError.message}`;
+ }
+ }
+ return result;
+ }
+ };
+ }
+
+ wrapMatchers(actualValue) {
+ const _this = this;
+ const wrappedMatchers = {
+ // 翻转标识
+ isNot: false,
+
+ // 翻转方法
+ not: function () {
+ this.isNot = true;
+ return this;
+ }
+ };
+ const specService = _this.coreContext.getDefaultService('spec');
+ const currentRunningSpec = specService.getCurrentRunningSpec();
+ for (const matcherName in this.matchers) {
+ let result = Object.prototype.hasOwnProperty.call(this.matchers, matcherName);
+ if (!result) {
+ continue;
+ }
+ if (matcherName.search('assertPromise') == 0) {
+ wrappedMatchers[matcherName] = async function () {
+ await _this.matchers[matcherName](actualValue, arguments).then(function (result) {
+ if (wrappedMatchers.isNot) {
+ result.pass = !result.pass;
+ }
+ result.actualValue = actualValue;
+ result.checkFunc = matcherName;
+ if (!result.pass) {
+ currentRunningSpec.addExpectationResult(result);
+ }
+ });
+ };
+ } else {
+ wrappedMatchers[matcherName] = function () {
+ const result = _this.matchers[matcherName](actualValue, arguments);
+ if (wrappedMatchers.isNot) {
+ result.pass = !result.pass;
+ }
+ result.actualValue = actualValue;
+ result.checkFunc = matcherName;
+ if (!result.pass) {
+ currentRunningSpec.addExpectationResult(result);
+ }
+ };
+ }
+ }
+ return wrappedMatchers;
+ }
+
+ apis() {
+ const _this = this;
+ return {
+ expect: function (actualValue) {
+ return _this.expect(actualValue);
+ }
+ };
+ }
+}
+
+class ReportService {
+ constructor(attr) {
+ this.id = attr.id;
+ }
+
+ init(coreContext) {
+ this.coreContext = coreContext;
+ this.specService = this.coreContext.getDefaultService('spec');
+ this.suiteService = this.coreContext.getDefaultService('suite');
+ this.duration = 0;
+ }
+
+ taskStart() {
+ console.info('[start] start run suites');
+ }
+
+ async suiteStart() {
+ console.info('[suite start]' + this.suiteService.getCurrentRunningSuite().description);
+ }
+
+ async specStart() {
+ console.info('start running case \'' + this.specService.currentRunningSpec.description + '\'');
+ this.index = this.index + 1;
+ let spec = this.specService.currentRunningSpec;
+ spec.startTime = await SysTestKit.getRealTime();
+ }
+
+ async specDone() {
+ let msg = '';
+ let spec = this.specService.currentRunningSpec;
+ let suite = this.suiteService.currentRunningSuite;
+ spec.duration = await SysTestKit.getRealTime() - spec.startTime;
+ suite.duration += spec.duration;
+ if (spec.error) {
+ this.formatPrint('error', spec.description + ' ; consuming ' + spec.duration + 'ms');
+ this.formatPrint('errorDetail', spec.error);
+ } else if (spec.result) {
+ if (spec.result.failExpects.length > 0) {
+ this.formatPrint('fail', spec.description + ' ; consuming ' + spec.duration + 'ms');
+ spec.result.failExpects.forEach(failExpect => {
+ msg = failExpect.message || ('expect ' + failExpect.actualValue + ' '
+ + failExpect.checkFunc + ' ' + (failExpect.expectValue));
+ this.formatPrint('failDetail', msg);
+ });
+ } else {
+ this.formatPrint('pass', spec.description + ' ; consuming ' + spec.duration + 'ms');
+ }
+ }
+ this.formatPrint(this.specService.currentRunningSpec.error, msg);
+ }
+
+ suiteDone() {
+ let suite = this.suiteService.currentRunningSuite;
+ console.info(`[suite end] ${suite.description} consuming ${suite.duration} ms`);
+ }
+
+ taskDone() {
+ let msg = '';
+ let summary = this.suiteService.getSummary();
+ msg = 'total cases:' + summary.total + ';failure ' + summary.failure + ',' + 'error ' + summary.error;
+ msg += ',pass ' + summary.pass + '; consuming ' + summary.duration + 'ms';
+ console.info(msg);
+ console.info('[end] run suites end');
+ }
+
+ incorrectFormat() {
+ if (this.coreContext.getDefaultService('config').filterValid.length !== 0) {
+ this.coreContext.getDefaultService('config').filterValid.forEach(function (item) {
+ console.info('this param ' + item + ' is invalid');
+ });
+ }
+ }
+
+ formatPrint(type, msg) {
+ switch (type) {
+ case 'pass':
+ console.info('[pass]' + msg);
+ break;
+ case 'fail':
+ console.info('[fail]' + msg);
+ break;
+ case 'failDetail':
+ console.info('[failDetail]' + msg);
+ break;
+ case 'error':
+ console.info('[error]' + msg);
+ break;
+ case 'errorDetail':
+ console.info('[errorDetail]' + msg);
+ break;
+ }
+ }
+
+ sleep(numberMillis) {
+ var now = new Date();
+ var exitTime = now.getTime() + numberMillis;
+ while (true) {
+ now = new Date();
+ if (now.getTime() > exitTime) {
+ return;
+ }
+ }
+ }
+}
+
+export {
+ SuiteService,
+ SpecService,
+ ExpectService,
+ ReportService
+};
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build-profile.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build-profile.json5
new file mode 100644
index 0000000000000000000000000000000000000000..989c850d90269886e5bbab58d829e9ba7257ebe1
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build-profile.json5
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "apiType": "stageMode",
+ "buildOption": {
+ },
+ "targets": [
+ {
+ "name": "default"
+ }
+ ]
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/ResourceTable.txt b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/ResourceTable.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6f0f5b65f1dfdf0b3c0b8377b94b4031058d22a3
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/ResourceTable.txt
@@ -0,0 +1 @@
+string page_show 0x01000000
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/build-profile.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/build-profile.json5
new file mode 100644
index 0000000000000000000000000000000000000000..989c850d90269886e5bbab58d829e9ba7257ebe1
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/build-profile.json5
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "apiType": "stageMode",
+ "buildOption": {
+ },
+ "targets": [
+ {
+ "name": "default"
+ }
+ ]
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/hvigorfile.ts b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/hvigorfile.ts
new file mode 100644
index 0000000000000000000000000000000000000000..eb1f1d089d8fbdcd5ea7af33ecb70f3c8b5bdfce
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/hvigorfile.ts
@@ -0,0 +1,17 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
+export { harTasks } from '@ohos/hvigor-ohos-plugin';
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/oh-package.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..4f86ec5788fae9bfb7c37a62e1fe493278c81e19
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/oh-package.json5
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "name": "path_provider",
+ "version": "1.0.0",
+ "description": "Please describe the basic information.",
+ "main": "index.ets",
+ "author": "",
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "@ohos/flutter_ohos": "file:libs/flutter_ohos.har"
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/ets/io/flutter/plugins/pathprovider/Messages.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/ets/io/flutter/plugins/pathprovider/Messages.ets
new file mode 100644
index 0000000000000000000000000000000000000000..28597a654670bde1dfe147bd6033286fa8f4f7b4
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/ets/io/flutter/plugins/pathprovider/Messages.ets
@@ -0,0 +1,237 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import Log from '@ohos/flutter_ohos/src/main/ets/util/Log';
+import BasicMessageChannel from '@ohos/flutter_ohos/src/main/ets/plugin/common/BasicMessageChannel';
+import { BinaryMessenger } from '@ohos/flutter_ohos/src/main/ets/plugin/common/BinaryMessenger';
+import MessageCodec from '@ohos/flutter_ohos/src/main/ets/plugin/common/MessageCodec';
+import StandardMessageCodec from '@ohos/flutter_ohos/src/main/ets/plugin/common/StandardMessageCodec';
+
+export enum StorageDirectory {
+ ROOT = 0,
+ MUSIC = 1,
+ PODCASTS = 2,
+ RINGTONES = 3,
+ ALARMS = 4,
+ NOTIFICATIONS = 5,
+ PICTURES = 6,
+ MOVIES = 7,
+ DOWNLOADS = 8,
+ DCIM = 9,
+ DOCUMENTS = 10
+}
+
+const TAG: string = "Message";
+
+export default class Messages {
+ static wrapError(exception: Error): Array {
+ const errorList: Array = new Array();
+ if (exception instanceof FlutterError) {
+ const error = exception;
+ errorList.push(error.code);
+ errorList.push(error.message);
+ errorList.push(error.details);
+ } else {
+ errorList.push(exception.name);
+ errorList.push(exception.message);
+ errorList.push(exception.stack);
+ }
+ return errorList;
+ }
+}
+
+export class FlutterError extends Error {
+ code: string;
+ details: ESObject;
+
+ constructor(code: string, message: string, details: ESObject) {
+ super(message);
+ this.code = code;
+ this.details = details;
+ }
+}
+
+export abstract class PathProviderApi {
+ abstract getTemporaryPath(): string;
+
+ abstract getApplicationSupportPath(): string;
+
+ abstract getApplicationDocumentsPath(): string;
+
+ abstract getExternalStoragePath(): string;
+
+ abstract getExternalCachePaths(): Array;
+
+ abstract getExternalStoragePaths(directory: StorageDirectory): Array;
+
+ static getCodec(): MessageCodec {
+ return new StandardMessageCodec();
+ }
+
+ static setup(binaryMessenger: BinaryMessenger, api: PathProviderApi) {
+ {
+ const channel: BasicMessageChannel =
+ new BasicMessageChannel(
+ binaryMessenger,
+ "dev.flutter.pigeon.PathProviderApi.getTemporaryPath",
+ PathProviderApi.getCodec());
+ if (api != null) {
+ channel.setMessageHandler({
+ onMessage: (message: ESObject, reply: ESObject) => {
+ Log.i(TAG, "setup on message : " + message);
+ let wrapped: Array = new Array();
+ try {
+ const output = api.getTemporaryPath();
+ wrapped.push(output);
+ } catch (err) {
+ const wrappedError: Array = Messages.wrapError(err);
+ wrapped = wrappedError;
+ }
+ reply.reply(wrapped);
+ }
+ })
+ } else {
+ channel.setMessageHandler(null);
+ }
+ }
+ {
+ const channel: BasicMessageChannel =
+ new BasicMessageChannel(
+ binaryMessenger,
+ "dev.flutter.pigeon.PathProviderApi.getApplicationSupportPath",
+ PathProviderApi.getCodec());
+ if (api != null) {
+ channel.setMessageHandler({
+ onMessage: (message: ESObject, reply: ESObject) => {
+ Log.i(TAG, "setup on message : " + message);
+ let wrapped: Array = new Array();
+ try {
+ const output = api.getApplicationSupportPath();
+ wrapped.push(output);
+ } catch (err) {
+ const wrappedError: Array = Messages.wrapError(err);
+ wrapped = wrappedError;
+ }
+ reply.reply(wrapped);
+ }
+ })
+ } else {
+ channel.setMessageHandler(null);
+ }
+ }
+ {
+ const channel: BasicMessageChannel =
+ new BasicMessageChannel(
+ binaryMessenger,
+ "dev.flutter.pigeon.PathProviderApi.getApplicationDocumentsPath",
+ PathProviderApi.getCodec());
+ if (api != null) {
+ channel.setMessageHandler({
+ onMessage: (message: ESObject, reply: ESObject) => {
+ Log.i(TAG, "setup on message : " + message);
+ let wrapped: Array = new Array();
+ try {
+ const output = api.getApplicationDocumentsPath();
+ wrapped.push(output);
+ } catch (err) {
+ const wrappedError: Array = Messages.wrapError(err);
+ wrapped = wrappedError;
+ }
+ reply.reply(wrapped);
+ }
+ })
+ } else {
+ channel.setMessageHandler(null);
+ }
+ }
+ {
+ const channel: BasicMessageChannel =
+ new BasicMessageChannel(
+ binaryMessenger,
+ "dev.flutter.pigeon.PathProviderApi.getExternalStoragePath",
+ PathProviderApi.getCodec());
+ if (api != null) {
+ channel.setMessageHandler({
+ onMessage: (message: ESObject, reply: ESObject) => {
+ Log.i(TAG, "setup on message : " + message);
+ let wrapped: Array = new Array();
+ try {
+ const output = api.getExternalStoragePath();
+ wrapped.push(output);
+ } catch (err) {
+ const wrappedError: Array = Messages.wrapError(err);
+ wrapped = wrappedError;
+ }
+ reply.reply(wrapped);
+ }
+ })
+ } else {
+ channel.setMessageHandler(null);
+ }
+ }
+ {
+ const channel: BasicMessageChannel =
+ new BasicMessageChannel(
+ binaryMessenger,
+ "dev.flutter.pigeon.PathProviderApi.getExternalCachePaths",
+ PathProviderApi.getCodec());
+ if (api != null) {
+ channel.setMessageHandler({
+ onMessage: (message: ESObject, reply: ESObject) => {
+ Log.i(TAG, "setup on message : " + message);
+ let wrapped: Array = new Array();
+ try {
+ const output = api.getExternalCachePaths();
+ wrapped.push(output);
+ } catch (err) {
+ const wrappedError: Array = Messages.wrapError(err);
+ wrapped = wrappedError;
+ }
+ reply.reply(wrapped);
+ }
+ })
+ } else {
+ channel.setMessageHandler(null);
+ }
+ }
+ {
+ const channel: BasicMessageChannel =
+ new BasicMessageChannel(
+ binaryMessenger,
+ "dev.flutter.pigeon.PathProviderApi.getExternalStoragePaths",
+ PathProviderApi.getCodec());
+ if (api != null) {
+ channel.setMessageHandler({
+ onMessage: (message: ESObject, reply: ESObject) => {
+ Log.i(TAG, "setup on message : " + message);
+ let wrapped: Array = new Array();
+ let args: Array = message;
+ const directoryArg: StorageDirectory = args[0] == null ? null : args[0];
+ try {
+ const output = api.getExternalStoragePaths(directoryArg);
+ wrapped.push(output);
+ } catch (err) {
+ const wrappedError: Array = Messages.wrapError(err);
+ wrapped = wrappedError;
+ }
+ reply.reply(wrapped);
+ }
+ })
+ } else {
+ channel.setMessageHandler(null);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/ets/io/flutter/plugins/pathprovider/PathProviderPlugin.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/ets/io/flutter/plugins/pathprovider/PathProviderPlugin.ets
new file mode 100644
index 0000000000000000000000000000000000000000..2488a9b60779b2bca29714926c47f513fae7adb2
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/ets/io/flutter/plugins/pathprovider/PathProviderPlugin.ets
@@ -0,0 +1,169 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import common from '@ohos.app.ability.common';
+import AbilityAware from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/ability/AbilityAware';
+import {
+ AbilityPluginBinding
+} from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/ability/AbilityPluginBinding';
+import {
+ FlutterPlugin,
+
+ FlutterPluginBinding
+} from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin';
+import Log from '@ohos/flutter_ohos/src/main/ets/util/Log';
+import PathUtils from '@ohos/flutter_ohos/src/main/ets/util/PathUtils';
+import { BinaryMessenger } from '@ohos/flutter_ohos/src/main/ets/plugin/common/BinaryMessenger';
+import { PathProviderApi, StorageDirectory } from './Messages';
+import fs from '@ohos.file.fs';
+
+const TAG: string = "PathProviderPlugin";
+
+export default class PathProviderPlugin extends PathProviderApi implements FlutterPlugin, AbilityAware {
+ private pluginBinding: FlutterPluginBinding;
+ private context: common.Context;
+
+ constructor(context?: common.Context) {
+ super();
+ if (context) {
+ this.context = context;
+ }
+ }
+
+ getUniqueClassName(): string {
+ return TAG;
+ }
+
+ onAttachedToEngine(binding: FlutterPluginBinding): void {
+ this.pluginBinding = binding;
+ }
+
+ onDetachedFromEngine(binding: FlutterPluginBinding): void {
+ this.pluginBinding = null;
+ }
+
+ onAttachedToAbility(binding: AbilityPluginBinding): void {
+ Log.i(TAG, "onAttachedToAbility");
+ this.setup(this.pluginBinding.getBinaryMessenger(), this.pluginBinding.getApplicationContext());
+ }
+
+ onDetachedFromAbility(): void {
+ }
+
+ static registerWith(): void {
+ }
+
+ setup(messenger: BinaryMessenger, context: common.Context) {
+ try {
+ PathProviderApi.setup(messenger, this);
+ } catch (err) {
+ Log.e(TAG, "Received exception while setting up PathProviderPlugin", err);
+ }
+ this.context = context;
+ }
+
+ getTemporaryPath(): string {
+ return this.getPathProviderTemporaryDirectory();
+ }
+
+ getApplicationSupportPath(): string {
+ return this.getApplicationSupportDirectory();
+ }
+
+ getApplicationDocumentsPath(): string {
+ return this.getPathProviderApplicationDocumentsDirectory();
+ }
+
+ getExternalStoragePath(): string {
+ return this.getPathProviderStorageDirectory();
+ }
+
+ getExternalCachePaths(): Array {
+ return this.getPathProviderExternalCacheDirectories();
+ }
+
+ getExternalStoragePaths(directory: StorageDirectory): Array {
+ return this.getPathProviderExternalStorageDirectories(directory);
+ }
+
+ private getPathProviderTemporaryDirectory(): string {
+ return this.context.tempDir;
+ }
+
+ private getApplicationSupportDirectory(): string {
+ return PathUtils.getFilesDir(this.context);
+ }
+
+ private getPathProviderApplicationDocumentsDirectory(): string {
+ return PathUtils.getDataDirectory(this.context);
+ }
+
+ private getPathProviderStorageDirectory(): string {
+ return this.context.filesDir;
+ }
+
+ private getPathProviderExternalCacheDirectories(): Array {
+ const paths = new Array();
+ paths.push(this.context.cacheDir);
+ return paths;
+ }
+
+ private getStorageDirectoryString(directory: StorageDirectory): string {
+ switch (directory) {
+ case StorageDirectory.ROOT:
+ return "";
+ case StorageDirectory.MUSIC:
+ return "music";
+ case StorageDirectory.PODCASTS:
+ return "podcasts";
+ case StorageDirectory.RINGTONES:
+ return "ringtones";
+ case StorageDirectory.ALARMS:
+ return "alarms";
+ case StorageDirectory.NOTIFICATIONS:
+ return "notifications";
+ case StorageDirectory.PICTURES:
+ return "pictures";
+ case StorageDirectory.MOVIES:
+ return "movies";
+ case StorageDirectory.DOWNLOADS:
+ return "downloads";
+ case StorageDirectory.DCIM:
+ return "dcim";
+ case StorageDirectory.DOCUMENTS:
+ return "documents";
+ default:
+ throw new Error("Unrecognized directory: " + directory);
+ }
+ }
+
+ private getPathProviderExternalStorageDirectories(directory: StorageDirectory): Array {
+ const paths = new Array();
+ const filePath = this.context.filesDir + "/" + this.getStorageDirectoryString(directory);
+ if (!fs.accessSync(filePath)) {
+ try {
+ fs.mkdirSync(filePath);
+ paths.push(filePath);
+ Log.i(TAG, "no directory " + filePath + " create success");
+ } catch (err) {
+ Log.e(TAG, "mkdirSync failed err:" + err);
+ }
+ } else {
+ paths.push(filePath);
+ }
+
+ return paths;
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/module.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/module.json
new file mode 100644
index 0000000000000000000000000000000000000000..4f015a18d4e8ed4fbb0ffd3ce585624a2d3c8d31
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/module.json
@@ -0,0 +1,21 @@
+{
+ "app": {
+ "bundleName": "io.flutter.plugins.pathprovider",
+ "debug": true,
+ "versionCode": 1000000,
+ "versionName": "1.0.0",
+ "minAPIVersion": 40000010,
+ "targetAPIVersion": 40000010,
+ "apiReleaseType": "Release",
+ "compileSdkVersion": "4.0.0.40",
+ "compileSdkType": "HarmonyOS"
+ },
+ "module": {
+ "name": "path_provider",
+ "type": "har",
+ "deviceTypes": [
+ "default",
+ "tablet"
+ ]
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/resources/base/element/string.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/resources/base/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..1e76de0c66777cfe83568615c5c2e68c61d23fed
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "page_show",
+ "value": "page from npm package"
+ }
+ ]
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/resources/en_US/element/string.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/resources/en_US/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..1e76de0c66777cfe83568615c5c2e68c61d23fed
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/resources/en_US/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "page_show",
+ "value": "page from npm package"
+ }
+ ]
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/resources/zh_CN/element/string.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/resources/zh_CN/element/string.json
new file mode 100644
index 0000000000000000000000000000000000000000..1e76de0c66777cfe83568615c5c2e68c61d23fed
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/main/resources/zh_CN/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "page_show",
+ "value": "page from npm package"
+ }
+ ]
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/test/List.test.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/test/List.test.ets
new file mode 100644
index 0000000000000000000000000000000000000000..0db841ed9cff9fdea904b802e68d01f1d9b2b36a
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/test/List.test.ets
@@ -0,0 +1,20 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import localUnitTest from './LocalUnit.test';
+
+export default function testsuite() {
+ localUnitTest()
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/test/LocalUnit.test.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/test/LocalUnit.test.ets
new file mode 100644
index 0000000000000000000000000000000000000000..f3517276bcfc5453175c8f9b532d32b71e7d0e76
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/cache/default/default@PackageHar/src/test/LocalUnit.test.ets
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium';
+
+export default function localUnitTest() {
+ describe('localUnitTest', function () {
+ // Defines a test suite. Two parameters are supported: test suite name and test suite function.
+ beforeAll(function () {
+ // Presets an action, which is performed only once before all test cases of the test suite start.
+ // This API supports only one parameter: preset action function.
+ });
+ beforeEach(function () {
+ // Presets an action, which is performed before each unit test case starts.
+ // The number of execution times is the same as the number of test cases defined by **it**.
+ // This API supports only one parameter: preset action function.
+ });
+ afterEach(function () {
+ // Presets a clear action, which is performed after each unit test case ends.
+ // The number of execution times is the same as the number of test cases defined by **it**.
+ // This API supports only one parameter: clear action function.
+ });
+ afterAll(function () {
+ // Presets a clear action, which is performed after all test cases of the test suite end.
+ // This API supports only one parameter: clear action function.
+ });
+ it('assertContain', 0, function () {
+ // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
+ let a = 'abc';
+ let b = 'b';
+ // Defines a variety of assertion methods, which are used to declare expected boolean conditions.
+ expect(a).assertContain(b);
+ expect(a).assertEqual(a);
+ });
+ });
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/generated/r/default/ResourceTable.h b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/generated/r/default/ResourceTable.h
new file mode 100644
index 0000000000000000000000000000000000000000..7804e730e1b4dbdb21b54729d5039a3f06d01347
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/generated/r/default/ResourceTable.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2023 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef RESOURCE_TABLE_H
+#define RESOURCE_TABLE_H
+
+#include
+
+namespace OHOS {
+const int32_t STRING_PAGE_SHOW = 0x01000000;
+}
+#endif
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/merge_profile/default/module.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/merge_profile/default/module.json
new file mode 100644
index 0000000000000000000000000000000000000000..4f015a18d4e8ed4fbb0ffd3ce585624a2d3c8d31
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/merge_profile/default/module.json
@@ -0,0 +1,21 @@
+{
+ "app": {
+ "bundleName": "io.flutter.plugins.pathprovider",
+ "debug": true,
+ "versionCode": 1000000,
+ "versionName": "1.0.0",
+ "minAPIVersion": 40000010,
+ "targetAPIVersion": 40000010,
+ "apiReleaseType": "Release",
+ "compileSdkVersion": "4.0.0.40",
+ "compileSdkType": "HarmonyOS"
+ },
+ "module": {
+ "name": "path_provider",
+ "type": "har",
+ "deviceTypes": [
+ "default",
+ "tablet"
+ ]
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/process_profile/default/module.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/process_profile/default/module.json
new file mode 100644
index 0000000000000000000000000000000000000000..5fe3850329df700867f0f4692936181c9dd1f6b9
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/process_profile/default/module.json
@@ -0,0 +1,24 @@
+{
+ "app": {
+ "bundleName": "io.flutter.plugins.pathprovider",
+ "debug": true,
+ "versionCode": 1000000,
+ "versionName": "1.0.0",
+ "minAPIVersion": 40000010,
+ "targetAPIVersion": 40000010,
+ "apiReleaseType": "Release",
+ "compileSdkVersion": "4.0.0.40",
+ "compileSdkType": "HarmonyOS"
+ },
+ "module": {
+ "name": "path_provider",
+ "type": "har",
+ "deviceTypes": [
+ "default",
+ "tablet"
+ ],
+ "virtualMachine": "ark9.0.0.0",
+ "compileMode": "esmodule",
+ "dependencies": []
+ }
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/ResourceTable.txt b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/ResourceTable.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6f0f5b65f1dfdf0b3c0b8377b94b4031058d22a3
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/ResourceTable.txt
@@ -0,0 +1 @@
+string page_show 0x01000000
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/ids_map/id_defined.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/ids_map/id_defined.json
new file mode 100644
index 0000000000000000000000000000000000000000..384d0290daf29cee301a5271dec2824791a3d614
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/ids_map/id_defined.json
@@ -0,0 +1,10 @@
+{
+ "record" :
+ [
+ {
+ "id" : "0x01000000",
+ "name" : "page_show",
+ "type" : "string"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/module.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/module.json
new file mode 100644
index 0000000000000000000000000000000000000000..fd826dbf47a8c5bd149d62909693a88a3df49a52
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/module.json
@@ -0,0 +1,27 @@
+{
+ "app" :
+ {
+ "apiReleaseType" : "Release",
+ "bundleName" : "io.flutter.plugins.pathprovider",
+ "compileSdkType" : "HarmonyOS",
+ "compileSdkVersion" : "4.0.0.40",
+ "debug" : true,
+ "minAPIVersion" : 40000010,
+ "targetAPIVersion" : 40000010,
+ "versionCode" : 1000000,
+ "versionName" : "1.0.0"
+ },
+ "module" :
+ {
+ "compileMode" : "esmodule",
+ "dependencies" : [],
+ "deviceTypes" :
+ [
+ "default",
+ "tablet"
+ ],
+ "name" : "path_provider",
+ "type" : "har",
+ "virtualMachine" : "ark9.0.0.0"
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/resConfig.json b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/resConfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..272edbc65fdba3d0fd4ba496cc6c181d0aebc721
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/resConfig.json
@@ -0,0 +1 @@
+{"configPath":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\process_profile\\default\\module.json","packageName":"io.flutter.plugins.pathprovider","output":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default","moduleNames":"path_provider","ResourceTable":["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\generated\\r\\default\\ResourceTable.h"],"moduleResources":["D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\src\\main\\resources"],"dependencies":[],"ids":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\ids_map","definedIds":"D:\\project\\flutter-sig-package\\packages\\packages\\path_provider\\path_provider_ohos\\ohos\\path_provider\\build\\default\\intermediates\\res\\default\\ids_map\\id_defined.json"}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/resources.index b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/resources.index
new file mode 100644
index 0000000000000000000000000000000000000000..3b7227cd2f2eb4b8f1ecc2cd52ad2411dd6f01d9
Binary files /dev/null and b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/intermediates/res/default/resources.index differ
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/outputs/default/path_provider.har b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/outputs/default/path_provider.har
new file mode 100644
index 0000000000000000000000000000000000000000..b49073ac77deb7ab1a4722ef4e4fb34a2bb57893
Binary files /dev/null and b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/build/default/outputs/default/path_provider.har differ
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/hvigorfile.ts b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/hvigorfile.ts
new file mode 100644
index 0000000000000000000000000000000000000000..eb1f1d089d8fbdcd5ea7af33ecb70f3c8b5bdfce
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/hvigorfile.ts
@@ -0,0 +1,17 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
+export { harTasks } from '@ohos/hvigor-ohos-plugin';
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/libs/flutter_embedding.har b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/libs/flutter_embedding.har
new file mode 100644
index 0000000000000000000000000000000000000000..146d26c0fbde7fade1030172bc679b8f857a7490
Binary files /dev/null and b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/libs/flutter_embedding.har differ
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh-package.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..c5b4395b50fb6f82ab488221c479b7e39129de20
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh-package.json5
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "@ohos/flutter_ohos": "file:libs/flutter_embedding.har"
+ },
+ "author": "",
+ "name": "path_provider",
+ "description": "Please describe the basic information.",
+ "main": "index.ets",
+ "version": "1.0.0",
+ "dependencies": {}
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/ResourceTable.txt b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/ResourceTable.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d159750ecea7bec636e067dea44f6b469601d685
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/ResourceTable.txt
@@ -0,0 +1 @@
+string page_show 0x02000000
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/build-profile.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/build-profile.json5
new file mode 100644
index 0000000000000000000000000000000000000000..95e376706d75437dce67c79dfd886e97fa82f276
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/build-profile.json5
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+{
+ "apiType": "stageMode",
+ "buildOption": {
+ },
+ "targets": [
+ {
+ "name": "default",
+ "runtimeOS": "HarmonyOS"
+ }
+ ],
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/hvigorfile.ts b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/hvigorfile.ts
new file mode 100644
index 0000000000000000000000000000000000000000..eb1f1d089d8fbdcd5ea7af33ecb70f3c8b5bdfce
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/hvigorfile.ts
@@ -0,0 +1,17 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
+export { harTasks } from '@ohos/hvigor-ohos-plugin';
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/index.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/index.ets
new file mode 100644
index 0000000000000000000000000000000000000000..3c96b70703b57d3e53a171aabf07727db248e94b
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/index.ets
@@ -0,0 +1,18 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+export { FlutterAbility } from './src/main/ets/embedding/ohos/FlutterAbility'
+
+export { FlutterPage } from './src/main/ets/embedding/ohos/FlutterPage'
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/libs/arm64-v8a/libc++_shared.so b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/libs/arm64-v8a/libc++_shared.so
new file mode 100644
index 0000000000000000000000000000000000000000..831c9353702073d45889352a4dafb93103d67d20
Binary files /dev/null and b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/libs/arm64-v8a/libc++_shared.so differ
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/libs/arm64-v8a/libflutter.so b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/libs/arm64-v8a/libflutter.so
new file mode 100644
index 0000000000000000000000000000000000000000..2aa191e0adafd258a3aee290e137f579d35ec427
Binary files /dev/null and b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/libs/arm64-v8a/libflutter.so differ
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/oh-package.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..c4acdada0ca16f1a1a4ada0bda0b669a04062911
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/oh-package.json5
@@ -0,0 +1,12 @@
+{
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "@types/libflutter.so": "file:./src/main/cpp/types/libflutter"
+ },
+ "author": "",
+ "name": "flutter_embedding",
+ "description": "Please describe the basic information.",
+ "main": "index.ets",
+ "version": "1.0.0",
+ "dependencies": {}
+}
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/cpp/types/libflutter/index.d.ts b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/cpp/types/libflutter/index.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bb628633cdb60882359286a05a10befeb05427fc
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/cpp/types/libflutter/index.d.ts
@@ -0,0 +1,66 @@
+import common from '@ohos.app.ability.common';
+import resourceManager from '@ohos.resourceManager';
+import image from '@ohos.multimedia.image';
+import FlutterNapi from '../../../ets/embedding/engine/FlutterNapi';
+
+export const getContext: (a: number) => napiContext;
+
+export class napiContext {
+ onPageShow();
+
+ onPageHide();
+}
+
+/**
+ * 设置刷新率
+ */
+export const nativeUpdateRefreshRate: (
+ ate: number
+) => {};
+
+/**
+ * 初始化dart vm和flutter engine
+ */
+export const nativeInit: (
+ context: common.Context,
+ args: Array,
+ bundlePath: string,
+ appStoragePath: string,
+ engineCachesPath: string,
+ initTimeMillis: number
+) => void;
+
+export const nativeAttach: (napi: FlutterNapi) => number;
+
+export const nativeRunBundleAndSnapshotFromLibrary: (
+ nativeShellHolderId: number,
+ bundlePath: string,
+ entrypointFunctionName: string,
+ pathToEntrypointFunction: string,
+ assetManager: resourceManager.ResourceManager,
+ entrypointArgs: Array
+) => void;
+
+//Send a data-carrying response to a platform message received from Dart.
+export const nativeInvokePlatformMessageResponseCallback: (nativeShellHolderId: number, responseId: number, message: ArrayBuffer, position: number) => void;
+
+// Send an empty response to a platform message received from Dart.
+export const nativeInvokePlatformMessageEmptyResponseCallback: (nativeShellHolderId: number, responseId: number) => void;
+
+// Send a data-carrying platform message to Dart.
+export const nativeDispatchPlatformMessage: (nativeShellHolderId: number, channel: String, message: ArrayBuffer, position: number, responseId: number) => void;
+
+// Send an empty platform message to Dart.
+export const nativeDispatchEmptyPlatformMessage: (nativeShellHolderId: number, channel: String, responseId: number) => void;
+
+export const nativeSetViewportMetrics: (nativeShellHolderId: number, devicePixelRatio: number, physicalWidth: number
+ , physicalHeight: number, physicalPaddingTop: number, physicalPaddingRight: number
+ , physicalPaddingBottom: number, physicalPaddingLeft: number, physicalViewInsetTop: number
+ , physicalViewInsetRight: number, physicalViewInsetBottom: number, physicalViewInsetLeft: number
+ , systemGestureInsetTop: number, systemGestureInsetRight: number, systemGestureInsetBottom: number
+ , systemGestureInsetLeft: number, physicalTouchSlop: number, displayFeaturesBounds: Array
+ , displayFeaturesType: Array, displayFeaturesState: Array) => void;
+
+export const nativeImageDecodeCallback: (width: number, height: number, imageGeneratorPointer: number, pixelMap : image.PixelMap) => void;
+
+export const nativeGetSystemLanguages: (nativeShellHolderId: number, languages: Array) => void;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/cpp/types/libflutter/index_actual.d.ts b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/cpp/types/libflutter/index_actual.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cb1b4f1eb7f1eaf5f362ec2c66d225dd5dc1c240
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/cpp/types/libflutter/index_actual.d.ts
@@ -0,0 +1,252 @@
+import common from '@ohos.app.ability.common';
+import resourceManager from '@ohos.resourceManager';
+import FlutterNapi from '../../../ets/embedding/engine/FlutterNapi';
+import image from '@ohos.multimedia.image';
+
+/**
+ * 设置刷新率
+ */
+export const nativeUpdateRefreshRate: (
+ ate: number
+) => void;
+
+/**
+ * 初始化dart vm和flutter engine
+ */
+export const nativeInit: (
+ context: common.Context,
+ args: Array,
+ bundlePath: string,
+ appStoragePath: string,
+ engineCachesPath: string,
+ initTimeMillis: number
+) => void;
+
+
+/**
+ * 加载dart工程构建产物
+ */
+export const nativeRunBundleAndSnapshotFromLibrary: (
+ bundlePath: string,
+ entrypointFunctionName: string,
+ pathToEntrypointFunction: string,
+ assetManager: resourceManager.ResourceManager,
+ entrypointArgs: Array
+) => void;
+
+/**
+ * 初始化SkFontMgr::RefDefault(),skia引擎文字管理初始化
+ */
+export const nativePrefetchDefaultFontManager: () => void;
+
+/**
+ * 返回是否支持软件绘制
+ */
+export const nativeGetIsSoftwareRenderingEnabled: () => boolean;
+
+/**
+ * attach flutterNapi实例给到 native engine,这个支持rkts到flutter平台的无关引擎之间的通信。
+ * attach只需要执行一次
+ */
+export const nativeAttach: (flutterNapi: FlutterNapi) => number;
+
+/**
+ * 从当前的flutterNapi复制一个新的实例
+ */
+export const nativeSpawn: (
+ nativeSpawningShellId: number,
+ entrypointFunctionName: string,
+ pathToEntrypointFunction: string,
+ initialRoute: string,
+ entrypointArgs: Array
+) => FlutterNapi;
+
+/**
+ * Detaches flutterNapi和engine之间的关联
+ * 这个方法执行前提是flutterNapi已经和engine关联
+ */
+export const nativeDestroy: (
+ nativeShellHolderId: number
+) => void;
+
+// 不需要实现,未使用到
+// export const nativeImageHeaderCallback: (
+// imageGeneratorPointer: number,
+// width: number,
+// height: number
+// ) => void;
+
+/**
+ * 不需要实现,c++层已有nativeSurface回调
+ */
+// export const nativeSurfaceCreated: (
+// nativeShellHolderId: number
+// ) => void;
+
+
+/**
+ * 不需要实现,c++层已有nativeSurface回调
+ */
+// export const nativeSurfaceWindowChanged: (
+// nativeShellHolderId: number
+// ) => void;
+
+
+/**
+ * 不需要实现,c++层已有nativeSurface回调
+ */
+// export const nativeSurfaceChanged: (
+// nativeShellHolderId: number,
+// width: number,
+// height: number
+// ) => void;
+
+/**
+ * 不需要实现,c++层已有nativeSurface回调
+ */
+// export const nativeSurfaceDestroyed: (
+// nativeShellHolderId: number
+// ) => void;
+
+/**
+ * 把物理屏幕参数通知到native
+ */
+export const nativeSetViewportMetrics: (
+ nativeShellHolderId: number,
+ devicePixelRatio: number,
+ physicalWidth: number,
+ physicalHeight: number,
+ physicalPaddingTop: number,
+ physicalPaddingRight: number,
+ physicalPaddingBottom: number,
+ physicalPaddingLeft: number,
+ physicalViewInsetTop: number,
+ physicalViewInsetRight: number,
+ physicalViewInsetBottom: number,
+ physicalViewInsetLeft: number,
+ systemGestureInsetTop: number,
+ systemGestureInsetRight: number,
+ systemGestureInsetBottom: number,
+ systemGestureInsetLeft: number,
+ physicalTouchSlop: number,
+ displayFeaturesBounds: Array,
+ displayFeaturesType: Array,
+ displayFeaturesState: Array
+) => void;
+
+/**
+ * 设置能力参数
+ */
+export const nativeSetAccessibilityFeatures: (
+ nativeShellHolderId: number,
+ flags: number
+) => void;
+
+/**
+ * 清除某个messageData
+ */
+export const nativeCleanupMessageData: (
+ messageData: number
+) => void;
+
+/**
+ * 发送一个空的PlatformMessage
+ */
+export const nativeDispatchEmptyPlatformMessage: (
+ nativeShellHolderId: number,
+ channel: string,
+ responseId: number
+) => void;
+
+/**
+ * 发送一个PlatformMessage
+ */
+export const nativeDispatchPlatformMessage: (
+ nativeShellHolderId: number,
+ channel: string,
+ message: ArrayBuffer,
+ position: number,
+ responseId: number
+) => void;
+
+/**
+ * 空的PlatformMessage响应回调
+ */
+export const nativeInvokePlatformMessageEmptyResponseCallback: (
+ nativeShellHolderId: number,
+ responseId: number
+) => void;
+
+/**
+ * PlatformMessage响应回调
+ */
+export const nativeInvokePlatformMessageResponseCallback: (
+ nativeShellHolderId: number,
+ responseId: number,
+ message: ArrayBuffer,
+ position: number
+) => void;
+
+
+/**
+ * load一个合法的.so文件到dart vm
+ */
+export const nativeLoadDartDeferredLibrary: (
+ nativeShellHolderId: number,
+ loadingUnitId: number,
+ searchPaths: Array
+) => void;
+
+/**
+ * 设置ResourceManager和assetBundlePath到engine
+ */
+export const nativeUpdateOhosAssetManager: (
+ nativeShellHolderId: number,
+ resourceManager: resourceManager.ResourceManager,
+ assetBundlePath: string
+) => void;
+
+/**
+ * 加载动态库,或者dart库失败时的通知
+ */
+export const nativeDeferredComponentInstallFailure: (
+ loadingUnitId: number,
+ error: string,
+ isTransient: boolean
+) => void;
+
+/**
+ * 从engine获取当前绘制pixelMap
+ */
+export const nativeGetPixelMap: () => image.PixelMap;
+
+/**
+ * 应用低内存警告
+ */
+export const nativeNotifyLowMemoryWarning: (
+ nativeShellHolderId: number
+) => void;
+
+// ----- Start FlutterTextUtils Methods ----
+/**
+ * 下面的方法,从键盘输入中判断当前字符是否是emoji,实现优先级低
+ */
+export const nativeFlutterTextUtilsIsEmoji: (
+ codePoint: number
+) => boolean;
+
+export const nativeFlutterTextUtilsIsEmojiModifier: (
+ codePoint: number
+) => boolean;
+
+export const nativeFlutterTextUtilsIsEmojiModifierBase: (
+ codePoint: number
+) => boolean;
+
+export const nativeFlutterTextUtilsIsVariationSelector: (
+ codePoint: number
+) => boolean;
+
+export const nativeFlutterTextUtilsIsRegionalIndicator: (
+ codePoint: number
+) => boolean;
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/cpp/types/libflutter/oh-package.json5 b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/cpp/types/libflutter/oh-package.json5
new file mode 100644
index 0000000000000000000000000000000000000000..0e11cf2c3c8aefb7ddcff477d21b2894d08b5520
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/cpp/types/libflutter/oh-package.json5
@@ -0,0 +1,6 @@
+{
+ "name": "libflutter.so",
+ "types": "./index.d.ts",
+ "version": "",
+ "description": "Please describe the basic information."
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/FlutterInjector.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/FlutterInjector.ets
new file mode 100644
index 0000000000000000000000000000000000000000..4e6f2f8b0e5dd765611d87ac3b2c2c552ff5adb2
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/FlutterInjector.ets
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import FlutterNapi from './embedding/engine/FlutterNapi';
+import FlutterLoader from './embedding/engine/loader/FlutterLoader';
+
+/**
+ * flutter相关主要类的单例持有,帮助实现自身和其他类的实例化管理
+ */
+export default class FlutterInjector {
+ private static instance: FlutterInjector;
+
+ private flutterLoader: FlutterLoader;
+ private flutterNapi: FlutterNapi;
+
+ static getInstance(): FlutterInjector {
+ if (FlutterInjector.instance == null) {
+ FlutterInjector.instance = new FlutterInjector();
+ }
+ return FlutterInjector.instance;
+ }
+ /**
+ * 初始化
+ */
+ private constructor() {
+ this.flutterNapi = new FlutterNapi();
+ this.flutterLoader = new FlutterLoader(this.flutterNapi);
+ }
+
+ getFlutterLoader(): FlutterLoader {
+ return this.flutterLoader;
+ }
+
+ getFlutterNapi(): FlutterNapi {
+ return this.flutterNapi;
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/app/FlutterPluginRegistry.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/app/FlutterPluginRegistry.ets
new file mode 100644
index 0000000000000000000000000000000000000000..77c89858b09535ee4b34af516b7eb18cb5d5a3ee
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/app/FlutterPluginRegistry.ets
@@ -0,0 +1,34 @@
+import FlutterView from '../embedding/ohos/FlutterView';
+import common from '@ohos.app.ability.common';
+import PlatformViewController from '../plugin/platform/PlatformViewsController'
+import Log from '../util/Log';
+
+export default class FlutterPluginRegistry {
+ private mPlatformViewsController: PlatformViewController;
+ private mFlutterView: FlutterView;
+ private mContext: common.Context;
+
+ constructor() {
+ this.mPlatformViewsController = new PlatformViewController();
+ }
+
+ attach(flutterView: FlutterView, context: common.Context): void {
+ this.mFlutterView = flutterView;
+ this.mContext = context;
+ }
+
+ detach(): void {
+ this.mPlatformViewsController.detach();
+ this.mPlatformViewsController.onDetachedFromNapi();
+ this.mFlutterView = null;
+ this.mContext = null;
+ }
+
+ destroy(): void {
+ this.mPlatformViewsController.onDetachedFromNapi();
+ }
+
+ onPreEngineRestart(): void{
+ this.mPlatformViewsController.onPreEngineRestart();
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/component/FlutterComponent.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/component/FlutterComponent.ets
new file mode 100644
index 0000000000000000000000000000000000000000..07497e672b21c51727c1a45166504e19603e4063
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/component/FlutterComponent.ets
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+/**
+ * 基础component,还未封装,看情况是否使用
+ */
+@Component
+export default struct FlutterComponent {
+ build() {
+ Row() {
+ Column() {
+ Text("xxx")
+ .fontSize(50)
+ .fontWeight(FontWeight.Bold)
+ }
+ .width('100%')
+ }
+ .height('100%')
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngine.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngine.ets
new file mode 100644
index 0000000000000000000000000000000000000000..4a16a419d9c7a5df84379278cdc7fb113624d7f7
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngine.ets
@@ -0,0 +1,277 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import LifecycleChannel from './systemchannels/LifecycleChannel';
+import DartExecutor, { DartEntrypoint } from './dart/DartExecutor';
+import FlutterShellArgs from './FlutterShellArgs';
+import FlutterInjector from '../../FlutterInjector';
+import FlutterLoader from './loader/FlutterLoader';
+import common from '@ohos.app.ability.common';
+import resourceManager from '@ohos.resourceManager';
+import FlutterNapi from './FlutterNapi';
+import NavigationChannel from './systemchannels/NavigationChannel';
+import Log from '../../util/Log';
+import TestChannel from './systemchannels/TestChannel'
+import FlutterEngineConnectionRegistry from './FlutterEngineConnectionRegistry';
+import PluginRegistry from './plugins/PluginRegistry';
+import AbilityControlSurface from './plugins/ability/AbilityControlSurface';
+import TextInputChannel from './systemchannels/TextInputChannel';
+import TextInputPlugin from '../../plugin/editing/TextInputPlugin';
+import PlatformChannel from './systemchannels/PlatformChannel';
+import FlutterEngineGroup from './FlutterEngineGroup';
+import SystemChannel from './systemchannels/SystemChannel';
+import MouseCursorChannel from './systemchannels/MouseCursorChannel';
+import RestorationChannel from './systemchannels/RestorationChannel';
+import LocalizationChannel from './systemchannels/LocalizationChannel';
+import AccessibilityChannel from './systemchannels/AccessibilityChannel';
+import LocalizationPlugin from '../../plugin/localization/LocalizationPlugin'
+import SettingsChannel from './systemchannels/SettingsChannel';
+import PlatformViewsController from '../../plugin/platform/PlatformViewsController';
+
+const TAG = "FlutterEngine";
+
+/**
+ * 操作FlutterEngin相关
+ */
+export default class FlutterEngine implements EngineLifecycleListener{
+ private engineLifecycleListeners = new Set();
+
+ dartExecutor: DartExecutor;
+ private flutterLoader: FlutterLoader;
+ private assetManager: resourceManager.ResourceManager;
+ //channel定义
+ private lifecycleChannel: LifecycleChannel;
+ private navigationChannel: NavigationChannel;
+ private textInputChannel: TextInputChannel;
+ private testChannel: TestChannel;
+ private platformChannel: PlatformChannel;
+ private systemChannel: SystemChannel;
+ private mouseCursorChannel: MouseCursorChannel;
+ private restorationChannel: RestorationChannel;
+
+ private accessibilityChannel: AccessibilityChannel;
+ private localeChannel: LocalizationChannel;
+ private flutterNapi: FlutterNapi;
+ private pluginRegistry: FlutterEngineConnectionRegistry;
+ private textInputPlugin: TextInputPlugin;
+ private localizationPlugin: LocalizationPlugin;
+ private settingsChannel: SettingsChannel;
+ private platformViewsController: PlatformViewsController;
+
+ /**
+ * 需要初始化的工作:
+ * 1、初始化DartExecutor
+ * 2、初始化所有channel
+ * 3、初始化plugin
+ * 4、初始化flutterLoader
+ * 5、初始化flutterNapi
+ * 6、engineLifecycleListeners
+ */
+ constructor(context: common.Context, flutterLoader: FlutterLoader, flutterNapi: FlutterNapi, platformViewsController: PlatformViewsController) {
+ const injector: FlutterInjector = FlutterInjector.getInstance();
+
+ if(flutterNapi == null){
+ flutterNapi = FlutterInjector.getInstance().getFlutterNapi();
+ }
+ this.flutterNapi = flutterNapi;
+ this.assetManager = context.resourceManager;
+
+ this.dartExecutor = new DartExecutor(this.flutterNapi, this.assetManager);
+ this.dartExecutor.onAttachedToNAPI();
+
+ if(flutterLoader == null){
+ flutterLoader = injector.getFlutterLoader();
+ }
+ this.flutterLoader = flutterLoader;
+
+ if(platformViewsController == null) {
+ platformViewsController = new PlatformViewsController();
+ }
+ this.platformViewsController = platformViewsController;
+ this.platformViewsController.attach(context, null, this.dartExecutor);
+ }
+
+ async init(context: common.Context, dartVmArgs: Array, automaticallyRegisterPlugins: boolean,
+ waitForRestorationData: boolean, group: FlutterEngineGroup) {
+ if (!this.flutterNapi.isAttached()) {
+ await this.flutterLoader.startInitialization(context)
+ this.flutterLoader.ensureInitializationComplete(dartVmArgs);
+ }
+ //channel初始化
+ this.lifecycleChannel = new LifecycleChannel(this.dartExecutor);
+ this.navigationChannel = new NavigationChannel(this.dartExecutor);
+ this.textInputChannel = new TextInputChannel(this.dartExecutor);
+ this.testChannel = new TestChannel(this.dartExecutor);
+ this.platformChannel = new PlatformChannel(this.dartExecutor);
+ this.systemChannel = new SystemChannel(this.dartExecutor);
+ this.mouseCursorChannel = new MouseCursorChannel(this.dartExecutor);
+ this.restorationChannel = new RestorationChannel(this.dartExecutor, waitForRestorationData);
+ this.settingsChannel = new SettingsChannel(this.dartExecutor);
+
+ this.localeChannel = new LocalizationChannel(this.dartExecutor);
+ this.accessibilityChannel = new AccessibilityChannel(this.dartExecutor, this.flutterNapi);
+ this.flutterNapi.addEngineLifecycleListener(this);
+ this.localizationPlugin = new LocalizationPlugin(context, this.localeChannel);
+
+ // It should typically be a fresh, unattached NAPI. But on a spawned engine, the NAPI instance
+ // is already attached to a native shell. In that case, the Java FlutterEngine is created around
+ // an existing shell.
+ if (!this.flutterNapi.isAttached()) {
+ this.attachToNapi();
+ }
+
+ this.pluginRegistry = new FlutterEngineConnectionRegistry(context.getApplicationContext(), this, this.flutterLoader, group);
+ this.localizationPlugin.sendLocaleToFlutter();
+ }
+
+ private attachToNapi(): void {
+ Log.d(TAG, "Attaching to NAPI.");
+ this.flutterNapi.attachToNative();
+
+ if (!this.isAttachedToNapi()) {
+ throw new Error("FlutterEngine failed to attach to its native Object reference.");
+ }
+ this.flutterNapi.setLocalizationPlugin(this.localizationPlugin);
+ }
+
+ async spawn(context: common.Context,
+ dartEntrypoint: DartEntrypoint,
+ initialRoute: string,
+ dartEntrypointArgs: Array,
+ platformViewsController: PlatformViewsController,
+ automaticallyRegisterPlugins: boolean, waitForRestorationData: boolean) {
+ if (!this.isAttachedToNapi()) {
+ throw new Error(
+ "Spawn can only be called on a fully constructed FlutterEngine");
+ }
+
+ const newFlutterNapi =
+ this.flutterNapi.spawn(
+ dartEntrypoint.dartEntrypointFunctionName,
+ dartEntrypoint.dartEntrypointLibrary,
+ initialRoute,
+ dartEntrypointArgs);
+ const flutterEngine = new FlutterEngine(
+ context,
+ null,
+ newFlutterNapi,
+ platformViewsController
+ );
+ await flutterEngine.init(context, null, automaticallyRegisterPlugins, waitForRestorationData, null)
+ return flutterEngine
+ }
+
+ private isAttachedToNapi(): boolean {
+ return this.flutterNapi.isAttached();
+ }
+
+ getLifecycleChannel(): LifecycleChannel {
+ return this.lifecycleChannel;
+ }
+
+ getNavigationChannel(): NavigationChannel {
+ return this.navigationChannel;
+ }
+
+ getTextInputChannel(): TextInputChannel {
+ return this.textInputChannel;
+ }
+
+ getPlatformChannel(): PlatformChannel {
+ return this.platformChannel;
+ }
+
+ getSystemChannel(): SystemChannel {
+ return this.systemChannel;
+ }
+
+ getLocaleChannel(): LocalizationChannel {
+ return this.localeChannel;
+ }
+
+ getMouseCursorChannel(): MouseCursorChannel {
+ return this.mouseCursorChannel;
+ }
+
+ getFlutterNapi(): FlutterNapi {
+ return this.flutterNapi;
+ }
+
+ getDartExecutor(): DartExecutor {
+ return this.dartExecutor
+ }
+
+ getPlugins(): PluginRegistry {
+ return this.pluginRegistry;
+ }
+
+ getAbilityControlSurface(): AbilityControlSurface {
+ return this.pluginRegistry;
+ }
+
+ getSettingsChannel() {
+ return this.settingsChannel;
+ }
+
+ onPreEngineRestart(): void {
+
+ }
+
+ onEngineWillDestroy(): void {
+
+ }
+
+ addEngineLifecycleListener(listener: EngineLifecycleListener): void {
+ this.engineLifecycleListeners.add(listener);
+ }
+
+ removeEngineLifecycleListener(listener: EngineLifecycleListener): void {
+ this.engineLifecycleListeners.delete(listener);
+ }
+
+ destroy(): void {
+ Log.d(TAG, "Destroying.");
+ this.engineLifecycleListeners.forEach(listener => listener.onEngineWillDestroy())
+ this.flutterNapi.removeEngineLifecycleListener(this);
+ this.pluginRegistry.detachFromAbility();
+ this.platformViewsController.onDetachedFromNapi();
+ }
+
+ getRestorationChannel(): RestorationChannel{
+ return this.restorationChannel;
+ }
+
+ getAccessibilityChannel(): AccessibilityChannel {
+ return this.accessibilityChannel;
+ }
+
+ getLocalizationPlugin(): LocalizationPlugin {
+ return this.localizationPlugin;
+ }
+
+ getSystemLanguages(): void {
+ return this.flutterNapi.getSystemLanguages();
+ }
+
+ getPlatformViewsController(): PlatformViewsController {
+ return this.platformViewsController;
+ }
+}
+
+export interface EngineLifecycleListener {
+ onPreEngineRestart(): void;
+
+ onEngineWillDestroy(): void;
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngineCache.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngineCache.ets
new file mode 100644
index 0000000000000000000000000000000000000000..78db31cae3a9d154a09f9f85541115dc4452573f
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngineCache.ets
@@ -0,0 +1,64 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import FlutterEngine from "./FlutterEngine"
+
+export default class FlutterEngineCache {
+ private static instance : FlutterEngineCache;
+ private cachedEngines: Map = new Map();
+
+ static getInstance(): FlutterEngineCache {
+ if (FlutterEngineCache.instance == null) {
+ FlutterEngineCache.instance = new FlutterEngineCache();
+ }
+ return FlutterEngineCache.instance;
+ }
+ /**
+ * 返回engineId对应的FlutterEngine是否存在
+ */
+ contains(engineId: String) : boolean {
+ return this.cachedEngines.has(engineId);
+ }
+
+ /**
+ * 返回engineId对应的FlutterEngine
+ */
+ get(engineId: String) : FlutterEngine {
+ return this.cachedEngines.get(engineId);
+ }
+ /**
+ * 将传入的FlutterEngine与engineId放在缓存中
+ */
+ put(engineId :String, engine: FlutterEngine): void {
+ if(engine != null) {
+ this.cachedEngines.set(engineId, engine);
+ } else {
+ this.cachedEngines.delete(engineId);
+ }
+ }
+ /**
+ * 移除engineId对应的FlutterEngine
+ */
+ remove(engineId: String) : void {
+ this.put(engineId, null);
+ }
+
+ /**
+ * 移除cachedEngines所有中所有的FlutterEngine
+ */
+ clear():void {
+ this.cachedEngines.clear();
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngineConnectionRegistry.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngineConnectionRegistry.ets
new file mode 100644
index 0000000000000000000000000000000000000000..7709ea8a31e98f794314a7e2f3b84e890f1eee9f
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngineConnectionRegistry.ets
@@ -0,0 +1,265 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import PluginRegistry from './plugins/PluginRegistry';
+import { FlutterAssets, FlutterPlugin, FlutterPluginBinding } from './plugins/FlutterPlugin';
+import FlutterEngine from './FlutterEngine';
+import AbilityAware from './plugins/ability/AbilityAware';
+import UIAbility from '@ohos.app.ability.UIAbility';
+import {
+ AbilityPluginBinding,
+ WindowFocusChangedListener,
+ OnSaveStateListener,
+ NewWantListener
+} from './plugins/ability/AbilityPluginBinding';
+import HashSet from '@ohos.util.HashSet';
+import Want from '@ohos.app.ability.Want';
+import AbilityConstant from '@ohos.app.ability.AbilityConstant';
+import common from '@ohos.app.ability.common';
+import FlutterLoader from './loader/FlutterLoader';
+import Log from '../../util/Log';
+import ToolUtils from '../../util/ToolUtils';
+import AbilityControlSurface from './plugins/ability/AbilityControlSurface';
+import ExclusiveAppComponent from '../ohos/ExclusiveAppComponent';
+import FlutterEngineGroup from './FlutterEngineGroup';
+
+const TAG = "FlutterEngineCxnRegstry";
+
+export default class FlutterEngineConnectionRegistry implements PluginRegistry, AbilityControlSurface {
+ // PluginRegistry
+ private plugins = new Map();
+
+ // Standard FlutterPlugin
+ private flutterEngine: FlutterEngine;
+ private pluginBinding: FlutterPluginBinding;
+
+ // AbilityAware
+ private abilityAwarePlugins = new Map();
+
+ private exclusiveAbility: ExclusiveAppComponent;
+ private abilityPluginBinding: FlutterEngineAbilityPluginBinding;
+
+ constructor(appContext: common.Context, flutterEngine: FlutterEngine, flutterLoader: FlutterLoader, group: FlutterEngineGroup) {
+ this.flutterEngine = flutterEngine;
+ this.pluginBinding = new FlutterPluginBinding(appContext, this.flutterEngine.getDartExecutor(), new DefaultFlutterAssets(flutterLoader), group, this.flutterEngine.getPlatformViewsController()?.getRegistry());
+ }
+
+ add(plugin: FlutterPlugin): void {
+ try {
+ if (this.has(plugin.getUniqueClassName())) {
+ Log.w(
+ TAG,
+ "Attempted to register plugin ("
+ + plugin
+ + ") but it was "
+ + "already registered with this FlutterEngine ("
+ + this.flutterEngine
+ + ").");
+ return;
+ }
+
+ Log.w(TAG, "Adding plugin: " + plugin);
+ // Add the plugin to our generic set of plugins and notify the plugin
+ // that is has been attached to an engine.
+ this.plugins.set(plugin.getUniqueClassName(), plugin);
+ plugin.onAttachedToEngine(this.pluginBinding);
+
+ // For AbilityAware plugins, add the plugin to our set of AbilityAware
+ // plugins, and if this engine is currently attached to an Ability,
+ // notify the AbilityAware plugin that it is now attached to an Ability.
+ if (ToolUtils.implementsInterface(plugin, "onAttachedToAbility")) {
+ const abilityAware: ESObject = plugin;
+ this.abilityAwarePlugins.set(plugin.getUniqueClassName(), abilityAware);
+ if (this.isAttachedToAbility()) {
+ abilityAware.onAttachedToAbility(this.abilityPluginBinding);
+ }
+ }
+ } finally {
+
+ }
+ }
+
+ addList(plugins: Set): void {
+ plugins.forEach(plugin => this.add(plugin))
+ }
+
+ has(pluginClassName: string): boolean {
+ return this.plugins.has(pluginClassName);
+ }
+
+ get(pluginClassName: string): FlutterPlugin {
+ return this.plugins.get(pluginClassName);
+ }
+
+ remove(pluginClassName: string): void {
+ const plugin = this.plugins.get(pluginClassName);
+ if (plugin == null) {
+ return;
+ }
+ if (ToolUtils.implementsInterface(plugin, "onAttachedToAbility")) {
+ if (this.isAttachedToAbility()) {
+ const abilityAware: ESObject = plugin;
+ abilityAware.onDetachedFromAbility();
+ }
+ this.abilityAwarePlugins.delete(pluginClassName);
+ }
+ // Notify the plugin that is now detached from this engine. Then remove
+ // it from our set of generic plugins.
+ plugin.onDetachedFromEngine(this.pluginBinding);
+ this.plugins.delete(pluginClassName)
+ }
+
+ removeList(pluginClassNames: Set): void {
+ pluginClassNames.forEach(plugin => this.remove(plugin))
+ }
+
+ removeAll(): void {
+ this.removeList(new Set(this.plugins.keys()));
+ this.plugins.clear();
+ }
+
+ private isAttachedToAbility(): boolean {
+ return this.exclusiveAbility != null;
+ }
+
+ attachToAbility(exclusiveAbility: ExclusiveAppComponent): void {
+ if (this.exclusiveAbility != null) {
+ this.exclusiveAbility.detachFromFlutterEngine();
+ }
+ // If we were already attached to an app component, detach from it.
+ this.detachFromAppComponent();
+ this.exclusiveAbility = exclusiveAbility;
+ this.attachToAbilityInternal(exclusiveAbility.getAppComponent(),);
+ }
+
+ detachFromAbility(): void {
+ if (this.isAttachedToAbility()) {
+ this.abilityAwarePlugins.forEach(abilityAware => abilityAware.onDetachedFromAbility())
+ this.detachFromAbilityInternal();
+ } else {
+ Log.e(TAG, "Attempted to detach plugins from an Ability when no Ability was attached.");
+ }
+ }
+
+ onNewWant(want: Want, launchParams: AbilityConstant.LaunchParam): void {
+ this.abilityPluginBinding.onNewWant(want, launchParams);
+ }
+
+ onWindowFocusChanged(hasFocus: boolean): void {
+ this.abilityPluginBinding.onWindowFocusChanged(hasFocus);
+ }
+
+ onSaveState(reason: AbilityConstant.StateType, wantParam: Record): AbilityConstant.OnSaveResult {
+ return this.abilityPluginBinding.onSaveState(reason, wantParam);
+ }
+
+ private detachFromAppComponent(): void {
+ if (this.isAttachedToAbility()) {
+ this.detachFromAbility();
+ }
+ }
+
+ private attachToAbilityInternal(ability: UIAbility): void {
+ this.abilityPluginBinding = new FlutterEngineAbilityPluginBinding(ability);
+ // Notify all AbilityAware plugins that they are now attached to a new Ability.
+ this.abilityAwarePlugins.forEach(abilityAware => abilityAware.onAttachedToAbility(this.abilityPluginBinding));
+ }
+
+ private detachFromAbilityInternal(): void {
+ this.exclusiveAbility = null;
+ this.abilityPluginBinding = null;
+ }
+
+ destroy(): void{
+ this.detachFromAppComponent();
+ // Remove all registered plugins.
+ this.removeAll();
+ }
+}
+
+class FlutterEngineAbilityPluginBinding implements AbilityPluginBinding {
+ private ability: UIAbility;
+ private onNewWantListeners = new HashSet();
+ private onWindowFocusChangedListeners = new HashSet();
+ private onSaveStateListeners = new HashSet();
+
+ constructor(ability: UIAbility) {
+ this.ability = ability;
+
+ }
+
+ getAbility(): UIAbility {
+ return this.ability;
+ }
+
+ addOnNewWantListener(listener: NewWantListener): void {
+ this.onNewWantListeners.add(listener)
+ }
+
+ removeOnNewWantListener(listener: NewWantListener): void {
+ this.onNewWantListeners.remove(listener)
+ }
+
+ addOnWindowFocusChangedListener(listener: WindowFocusChangedListener): void {
+ this.onWindowFocusChangedListeners.add(listener)
+ }
+
+ removeOnWindowFocusChangedListener(listener: WindowFocusChangedListener): void {
+ this.onWindowFocusChangedListeners.remove(listener)
+ }
+
+ addOnSaveStateListener(listener: OnSaveStateListener) {
+ this.onSaveStateListeners.add(listener)
+ }
+
+ removeOnSaveStateListener(listener: OnSaveStateListener) {
+ this.onSaveStateListeners.remove(listener)
+ }
+
+ onNewWant(want: Want, launchParams: AbilityConstant.LaunchParam): void {
+ this.onNewWantListeners.forEach((listener, key) => {
+ listener.onNewWant(want, launchParams)
+ });
+ }
+
+ onWindowFocusChanged(hasFocus: boolean): void {
+ this.onWindowFocusChangedListeners.forEach((listener, key) => {
+ listener.onWindowFocusChanged(hasFocus)
+ });
+ }
+
+ onSaveState(reason: AbilityConstant.StateType, wantParam: Record): AbilityConstant.OnSaveResult {
+ this.onSaveStateListeners.forEach((listener, key) => {
+ listener.onSaveState(reason, wantParam)
+ });
+ return AbilityConstant.OnSaveResult.ALL_AGREE;
+ }
+}
+
+class DefaultFlutterAssets implements FlutterAssets {
+ private flutterLoader: FlutterLoader;
+
+ constructor(flutterLoader: FlutterLoader) {
+ this.flutterLoader = flutterLoader;
+ }
+
+ getAssetFilePathByName(assetFileName: string, packageName?: string): string {
+ return this.flutterLoader.getLookupKeyForAsset(assetFileName, packageName);
+ }
+
+ getAssetFilePathBySubpath(assetSubpath: string, packageName?: string) {
+ return this.flutterLoader.getLookupKeyForAsset(assetSubpath, packageName);
+ }
+}
\ No newline at end of file
diff --git a/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngineGroup.ets b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngineGroup.ets
new file mode 100644
index 0000000000000000000000000000000000000000..05e35aec1b7b6f50ab8df336bdd69fbbe21febc8
--- /dev/null
+++ b/ohos/test_cached_network_image/lib/path_provider_ohos/ohos/path_provider/oh_modules/.ohpm/@ohos+flutter_ohos@file+libs+flutter_ohos.har/oh_modules/@ohos/flutter_ohos/src/main/ets/embedding/engine/FlutterEngineGroup.ets
@@ -0,0 +1,184 @@
+/*
+* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import FlutterEngine, { EngineLifecycleListener } from "./FlutterEngine"
+import common from '@ohos.app.ability.common'
+import FlutterLoader from './loader/FlutterLoader'
+import FlutterInjector from '../../FlutterInjector'
+import { DartEntrypoint } from './dart/DartExecutor'
+import PlatformViewsController from '../../plugin/platform/PlatformViewsController'
+import ArrayList from '@ohos.util.ArrayList'
+
+export default class FlutterEngineGroup {
+ private activeEngines: ArrayList = new ArrayList();
+
+ constructor() {
+
+ }
+
+ async checkLoader(context: common.Context, args: Array) {
+ let loader: FlutterLoader = FlutterInjector.getInstance().getFlutterLoader();
+ if (!loader.initialized) {
+ await loader.startInitialization(context.getApplicationContext());
+ loader.ensureInitializationComplete(args);
+ }
+ }
+
+ async createAndRunEngineByOptions(options: Options) {
+ let engine: FlutterEngine = null;
+ let context: common.Context = options.getContext();
+ let dartEntrypoint: DartEntrypoint = options.getDartEntrypoint();
+ let initialRoute: string = options.getInitialRoute();
+ let dartEntrypointArgs: Array = options.getDartEntrypointArgs();
+ let platformViewsController: PlatformViewsController = options.getPlatformViewsController();
+ let automaticallyRegisterPlugins: boolean = options.getAutomaticallyRegisterPlugins();
+ let waitForRestorationData: boolean = options.getWaitForRestorationData();
+
+ if (dartEntrypoint == null) {
+ dartEntrypoint = DartEntrypoint.createDefault();
+ }
+
+ if (platformViewsController == null) {
+ platformViewsController = new PlatformViewsController();
+ }
+
+ if (this.activeEngines.length == 0) {
+ engine = this.createEngine(context, platformViewsController);
+ await engine.init(context, null, // String[]. The Dart VM has already started, this arguments will have no effect.
+ automaticallyRegisterPlugins, // boolean.
+ waitForRestorationData, // boolean.
+ this)
+ if (initialRoute != null) {
+ engine.getNavigationChannel().setInitialRoute(initialRoute);
+ }
+ } else {
+ engine = await this.activeEngines[0]
+ .spawn(
+ context,
+ dartEntrypoint,
+ initialRoute,
+ dartEntrypointArgs,
+ platformViewsController,
+ automaticallyRegisterPlugins,
+ waitForRestorationData);
+ }
+ this.activeEngines.add(engine);
+
+ const engineToCleanUpOnDestroy = engine;
+ let listener: EngineLifecycleListener = new EngineLifecycleListenerImpl(
+ platformViewsController,
+ this.activeEngines,
+ engineToCleanUpOnDestroy);
+ engine.addEngineLifecycleListener(listener);
+ return engine;
+ }
+
+ createEngine(context: common.Context, platformViewsController: PlatformViewsController): FlutterEngine {
+ return new FlutterEngine(context, null, null, platformViewsController);
+ }
+}
+
+class EngineLifecycleListenerImpl implements EngineLifecycleListener {
+ private platformViewsController: PlatformViewsController;
+ private activeEngines: ArrayList = new ArrayList();
+ private engine: FlutterEngine;
+
+ constructor(
+ platformViewsController: PlatformViewsController,
+ activeEngines: ArrayList,
+ engine: FlutterEngine) {
+ this.platformViewsController = platformViewsController;
+ this.activeEngines = activeEngines;
+ this.engine = engine;
+ }
+ onPreEngineRestart(): void {
+ this.platformViewsController.onPreEngineRestart();
+ }
+ onEngineWillDestroy(): void {
+ this.activeEngines.remove(this.engine);
+ }
+}
+
+export class Options {
+ private context: common.Context;
+ private dartEntrypoint: DartEntrypoint;
+ private initialRoute: string;
+ private dartEntrypointArgs: Array;
+ private platformViewsController: PlatformViewsController;
+ private automaticallyRegisterPlugins: boolean = true;
+ private waitForRestorationData: boolean = false;
+
+ constructor(context: common.Context) {
+ this.context = context;
+ }
+
+ getContext(): common.Context {
+ return this.context;
+ }
+
+ getDartEntrypoint(): DartEntrypoint {
+ return this.dartEntrypoint;
+ }
+
+ getInitialRoute(): string {
+ return this.initialRoute;
+ }
+
+ getDartEntrypointArgs(): Array {
+ return this.dartEntrypointArgs;
+ }
+
+ getAutomaticallyRegisterPlugins(): boolean {
+ return this.automaticallyRegisterPlugins;
+ }
+
+ getWaitForRestorationData(): boolean {
+ return this.waitForRestorationData;
+ }
+
+ getPlatformViewsController(): PlatformViewsController {
+ return this.platformViewsController;
+ }
+
+ setDartEntrypoint(dartEntrypoint: DartEntrypoint): Options {
+ this.dartEntrypoint = dartEntrypoint;
+ return this;
+ }
+
+ setInitialRoute(initialRoute: string): Options {
+ this.initialRoute = initialRoute;
+ return this;
+ }
+
+ setDartEntrypointArgs(dartEntrypointArgs: Array